通用方法:使用参数实例化一个泛型类型

问题描述:

我有一个接受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 

我该怎么做我想要什么?

+1

我不能使用反射,我想避免使用Initialize函数,如果可能的话。不过这是一个选项。 – RCIX 2010-07-25 01:25:30

+0

用更多选项编辑答案......你甚至回答了上述第二个链接的问题:http://*.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

有没有办法来指定一个泛型类型参数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方法是在这个版本更复杂一些,因为你必须明确指定工厂(和你需要以实现它),但它可能更接近你想要的...