要实例化的类:
public class InstantiateMe
{
public String foo
{
get;
set;
}
}
一些伪代码:
public void CreateInstanceOf(Type t)
{
var instance = new t();
instance.foo = "bar";
}
到目前为止,我认为我需要使用反射来完成这项工作,考虑到我想要实现的动态特性。
这是我的成功标准:
我非常感谢一些有用的示例代码。我不是C#的新手,但我以前从未使用过反射。
答案 0 :(得分:4)
尝试以下方法来实际创建实例。
Object t = Activator.CreateInstance(t);
但是,如果没有泛型和约束,则无法静态访问成员,如示例所示。
您可以使用以下内容执行此操作
public void CreateInstanceOf<T>() where T : InstantiateMe, new()
{
T i = new T();
i.foo = "bar";
}
答案 1 :(得分:4)
你基本上需要使用Reflection。使用Activator.CreateInstance()
构建您的类型,然后在类型上调用InvokeMember()
,以设置属性:
public void CreateInstanceOfType(Type t)
{
var instance = Activator.CreateInstance(t); // create instance
// set property on the instance
t.InvokeMember(
"foo", // property name
BindingFlags.SetProperty,
null,
obj,
new Object[] { "bar" } // property value
);
}
要访问泛型类型的所有属性并设置/获取它们,您可以使用GetProperties()
返回PropertyInfo
集合,您可以迭代它:
foreach (PropertyInfo property in type.GetProperties())
{
property.GetValue() // get property
property.SetValue() // set property
}
另外,有关使用InvokeMember()
的更多方法,请参阅the documentation。
答案 2 :(得分:0)
由于您具有要实例化的类型,因此可以使用通用的辅助方法:
public static T New() where T : new() { return new T(); }
否则,如果您要删除其他地方的类型(如动态加载的程序集)并且您无法直接访问该类型(它是某种元编程或反射数据),则应使用反射。