2011-04-11 90 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) 
相關問題