如何为给定的Type创建实例?

Jad*_*ias 19 .net c# generics reflection constructor

有了泛型,你可以

var object = default(T);
Run Code Online (Sandbox Code Playgroud)

但是当你拥有的只是一个Type实例时,我只能这样做

constructor = type.GetConstructor(Type.EmptyTypes);
var parameters = new object[0];
var obj = constructor.Invoke(parameters);
Run Code Online (Sandbox Code Playgroud)

甚至

var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);
Run Code Online (Sandbox Code Playgroud)

是不是有更短的方式,如泛型版本?

Jon*_*eet 21

最接近的是Activator.CreateInstance:

object o = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

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

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

Type t = typeof(MemoryStream);
// Won't compile
MemoryStream ms = Activator.CreateInstance(t);
Run Code Online (Sandbox Code Playgroud)

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

请注意,default(T) 不会创建引用类型的实例 - 它为类型提供默认值,这是引用类型的空引用.比较CreateInstance实际创建新对象的那个.


jga*_*fin 15

var myObject = Activator.CreateInstance(myType)

如果要使用类型化参数,则必须进行强制转换:

User user = (User)Activator.CreateInstance(typeof(User));
Run Code Online (Sandbox Code Playgroud)

..或带参数

User user = (User)Activator.CreateInstance(typeof(User), new object[]{firstName, lastName});
Run Code Online (Sandbox Code Playgroud)

你也可以使用泛型:

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

var user = Create<User>();
Run Code Online (Sandbox Code Playgroud)

  • @nawfal:值对象用于独角兽. (2认同)
  • 如果我已经知道Type User,为什么我不应该直接使用new方法,问题是如何只使用System.Type变量优雅地创建对象 (2认同)