2010-07-25 105 views
3

我有一個接受T類型的泛型方法,我需要能夠調用一個需要單個XmlNode的構造函數。目前,我正在嘗試通過擁有一個抽象基類來實現我想要的構造函數(加上一個無參數的基類,所以我不必編輯除了添加實際子類化之外的「子類」)並通過它進行約束。如果我嘗試將這些類別實例之一,它抱怨:通用方法:使用參數實例化一個泛型類型

Cannot create an instance of the variable type 'T' because it does not have the new() constraint 

,如果我加入new()約束,我得到:

'T': cannot provide arguments when creating an instance of a variable type 

我該怎麼做我想要什麼?

回答

3
+1

我不能使用反射,我想避免使用Initialize函數,如果可能的話。不過這是一個選項。 – RCIX 2010-07-25 01:25:30

+0

用更多選項編輯答案......你甚至回答了上述第二個鏈接的問題:http://stackoverflow.com/questions/1682310/c-generics-problem-newing-up-the-generic-type-with-參數在構建/ 1691584#1691584 – 2010-07-25 01:29:31

+0

我可能會去與該鏈接SO問題的建議之一,謝謝! – RCIX 2010-07-25 03:20:42

2

有沒有辦法來指定一個泛型類型參數T應該有一個指定的參數的構造函數。事實上,基類有一些參數的構造函數並沒有幫助,因爲重寫類不需要必須具有相同的構造函數(例如,它可以調用具有某個值作爲參數的基礎構造函數)。

new()約束可用於僅需要無參數構造函數。我可能會建議添加一個接口約束(例如IConstructFromXml),該約束會有一個方法來初始化對象 - 然後在使用無參數構造函數創建對象後,可以調用該方法。

或者,您可以採用表示工廠的類型參數來創建指定類型的值。然後,您將創建工廠實例並使用它創建所需類型的值。喜歡的東西:

void Foo<TFactory, T>() where TFactory : IFactory<T> 
         where TFactory : new() { 
    var factory = new TFactory(); 
    T val = factory.Create(xmlNode); // Create method is defined in IFactory<T> 
    // ... 
} 

IFactory<T>界面看起來是這樣的:

interface IFactory<T> { 
    T Create(XmlNode node); 
} 

調用Foo方法是在這個版本更復雜一些,因爲你必須明確指定工廠(和你需要以實現它),但它可能更接近你想要的...

相關問題