2009-01-20 56 views
1

我想編寫一個通用的方法,該方法創建指定類型的新實例。我試圖創建一個n最常見的類型的新實例

protected T CreateNew<T>() 
    where T : new() 
{ 
    return new T(); 
} 

這工作,如果我指定在編譯時的類型,就像

var x = CreateNew<Point>(); 

的一點是,我需要做這樣的事情

ISomeInterface inter; 
if (selection == 1) 
    inter = new SomeClass(); 
else 
    inter = new SomeClass2(); 
// ... 
ISomeInterface inter2 = CreateNew<typeof(inter)>(); 
但只

其中SomeClass實現ISomeInterface。 但是,由於CreateNew()需要指定的實際類型,因此無法編譯。我不知道在運行時是否可以提供類似的內容,但上面的代碼無法編譯。

所以我有一個未知引用類型的實例,我需要創建幾個相同類型的實例。

有誰知道一種技術來實現這種行爲?

回答

1

您可以使用Lambda做到這一點:

Function<ISomeInterface> creationDelegate; 
if (selection == 1) 
    creationDelegate =() => CreateNew<SomeClass>; 
else 
    creationDelegate =() => CreateNew<SomeClass2>; 
ISomeInterface inter = creationDelegate(); 

// ... 
ISomeInterface inter2 = creationDelegate(); 

我看不出使用基於您的示例代碼在這種情況下,CreateNew方法的好處,但我假設你的「真實」代碼更復雜。

10

泛型的要點是提供一種機制,在時間編譯 -time時可以將代碼重用於不同類型。在這種情況下,編譯時不知道類型。

我建議你使用Activator.CreateInstance(inter.GetType());

+0

非常感謝! 我只是對通用方法感到困惑,因爲我猜我沒有正確理解用C#編寫的泛型的一些內容,說明泛型可以在運行時重用(與C++模板不同) – 2009-01-20 16:09:55