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

有了generics,你可以

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]); 

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

最接近的是Activator.CreateInstance

 object o = Activator.CreateInstance(type); 

…但当然这取决于有一个公共无参数构造函数。 (其他重载允许您指定构造函数参数。)

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

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

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

请注意, default(T) 不会创建引用类型的实例 – 它为类型提供默认值,这是引用类型的空引用。 将它与实际创建新对象的CreateInstance进行比较。

var myObject = Activator.CreateInstance(myType)

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

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

..或带参数

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

你也可以使用generics:

 public T Create() where T : class, new() { return new T(); } var user = Create(); 
 Activator.CreateInstance(type)