2011-04-11 89 views
18

有了泛型可以如何为给定类型创建实例?

var object = default(T); 

但是,当你已经是我能一个类型实例只

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

是不是有一个较短的方式,像泛型版本?

回答

19

最近的可用为Activator.CreateInstance

object o = Activator.CreateInstance(type); 

...但当然,这依赖于有成为上市参数构造函数。 (其他重载允许你指定构造参数)

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

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

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

注意default(T)不会创建一个引用类型的实例 - 它给出了类型,这是引用类型空引用的默认值。与CreateInstance比较,这实际上会创建一个新的对象。

+0

为什么你不提'Activator.CreateInstanc ()'? – nawfal 2013-06-12 19:59:31

+0

@nawfal:因为OP不知道'T' - 只有'Type'(作为执行时间值)。 – 2013-06-12 22:01:16

+0

乔恩是的,问题的最后一行让我困惑。 – nawfal 2013-06-12 23:34:04

12

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

第二种方法。我真的很喜欢这个:) – 2011-04-11 14:25:08

+0

如果在编译时已知类型,那么你可以使用Activator.CreateInstance ()。 – 2013-05-15 06:55:24

+0

为什么限制到类? *:)* – nawfal 2013-06-12 20:00:34

0
Activator.CreateInstance(type) 
相关问题