【问题标题】:How to create an instance for a given Type? [duplicate]如何为给定类型创建实例? [复制]
【发布时间】:2011-04-11 14:10:49
【问题描述】:

使用泛型可以

var object = default(T);

但是当你只有一个 Type 实例时,我只能

constructor = type.GetConstructor(Type.EmptyTypes);
var parameters = new object[0];
var obj = constructor.Invoke(parameters);

甚至

var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);

有没有更短的方法,比如泛型版本?

【问题讨论】:

    标签: c# .net generics reflection constructor


    【解决方案1】:

    最接近的可用是Activator.CreateInstance:

    object o = Activator.CreateInstance(type);
    

    ...但这当然依赖于公共无参数构造函数。 (其他重载允许您指定构造函数参数。)

    我在这里使用了一个显式类型的变量来表明我们确实没有类型本身的变量......你不能写:

    Type t = typeof(MemoryStream);
    // Won't compile
    MemoryStream ms = Activator.CreateInstance(t);
    

    例如。 CreateInstance的返回值的编译时类型始终为object。

    请注意,default(T) 不会创建引用类型的实例 - 它为该类型提供默认值,即引用类型的空引用。将其与 CreateInstance 进行比较,后者实际上会创建一个新对象。

    【讨论】:

    • 为什么不提Activator.CreateInstanc<T>()?
    • @nawfal:因为 OP 不知道 T - 只有 Type(作为执行时间值)。
    • 乔恩,是的,问题的最后一行让我很困惑。
    【解决方案2】:

    var myObject = Activator.CreateInstance(myType)

    如果你想使用类型化参数,你必须强制转换:

    User user = (User)Activator.CreateInstance(typeof(User));
    

    .. 或带参数

    User user = (User)Activator.CreateInstance(typeof(User), new object[]{firstName, lastName});
    

    你也可以使用泛型:

    public T Create<T>() where T : class, new()
    {
        return new T();
    }
    
    var user = Create<User>();
    

    【讨论】:

    • +1 表示第二种方法。我真的很喜欢这个:)
    • 如果在编译时类型是已知的,那么你不妨使用Activator.CreateInstance()。
    • 为什么要限制类? :)
    • @nawfal:值对象用于独角兽。
    • 如果我已经知道类型用户,为什么不直接使用新方法,问题是如何仅使用 System.Type 变量优雅地创建对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2021-12-27
    • 2017-04-17
    • 1970-01-01
    相关资源
    最近更新 更多