在编译时,人们可能并不总是知道一个对象的类型',但可能需要创建一个
类型'的实例。 你如何从一个 "类型 "中获得一个新的对象实例?
根 "系统 "命名空间中的 "激活器 "类是相当强大的。
有很多重载,用于向构造器传递参数等。请查看以下文档。
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
或 (新路径)
下面是一些简单的例子。
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
ObjectType instance = (ObjectType)Activator.CreateInstance("MyAssembly","MyNamespace.ObjectType");
这个问题的一个实现是试图调用Type的无参数构造函数。
public static object GetNewObject(Type t)
{
try
{
return t.GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return null;
}
}
下面是同样的方法,包含在一个通用方法中。
public static T GetNewObject<T>()
{
try
{
return (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return default(T);
}
}
如果这是为在应用实例中会被经常调用的东西,那么编译和缓存动态代码要比使用激活器或ConstructorInfo.Invoke()
快得多。 动态编译的两个简单的选择是编译后的Linq Expressions或一些简单的IL
操作码和DynamicMethod
。 无论哪种方式,当你开始进入严格的循环或多次调用时,差别是巨大的。