从类型获取新的对象实例

时间: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();"行不通吗?