通用方法:使用参数实例化generics类型

我有一个generics方法,它接受一个类型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 

我怎么能做我想要的?

无法指定generics类型参数T应具有带指定参数的构造函数。 基类具有带有一些参数的构造函数的事实没有帮助,因为overriden类不必具有相同的构造函数(例如,它可以使用某个值作为参数调用基础构造函数)。

new()约束可用于仅需要无参数构造函数。 我可能会建议添加一个接口约束(例如IConstructFromXml ),它有一个初始化对象的方法 – 然后你可以在使用无参数构造函数创建对象后调用该方法。

或者,您可以使用表示工厂的类型参数来创建指定类型的值。 然后,您将创建工厂的实例并使用它来创建所需类型的值。 就像是:

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

IFactory接口如下所示:

 interface IFactory { T Create(XmlNode node); } 

调用Foo方法在这个版本中涉及更多,因为你必须明确指定工厂(并且你也需要实现它),但它可能更接近你想要的…