从类型获取新的对象实例
时间:2020-03-05 18:37:25 来源:igfitidea点击:
在编译时可能并不总是知道对象的类型,但是可能需要创建该类型的实例。如何从Type获取新的对象实例?
解决方案:
此问题的一种实现是尝试调用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); } }
根System
命名空间中的Activator
类非常强大。
将参数传递给构造函数等有很多重载。在以下位置查看文档:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
或者(新路径)
https://docs.microsoft.com/en-us/dotnet/api/system.activator.createinstance
以下是一些简单的示例:
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType); ObjectType instance = (ObjectType)Activator.CreateInstance("MyAssembly","MyNamespace.ObjectType");
如果这是为了在应用程序实例中被大量调用,那么编译和缓存动态代码要比使用激活器或者" ConstructorInfo.Invoke()"要快得多。动态编译的两个简单选项是编译的Linq Expressions或者一些简单的IL
操作码和DynamicMethod
。无论哪种方式,当我们开始陷入紧密的循环或者多次调用时,两者之间的差异都是巨大的。
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
Activator类具有一个通用的变体,使它变得更容易一些:
ObjectType instance = Activator.CreateInstance<ObjectType>();
通用的" T t = new T();"行不通吗?