我有一个接受类型 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
我怎样才能做我想做的事?
无法指定泛型类型参数 T
应该有一个带有指定参数的构造函数。基类具有带有一些参数的构造函数这一事实无济于事,因为被覆盖的类不必具有相同的构造函数(例如,它可以调用具有某些值的基构造函数作为参数)。
new()
约束只能用于要求无参数构造函数。我可能会建议添加一个接口(interface)约束(例如 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
方法在这个版本中涉及更多一些,因为你必须显式指定工厂(你也需要实现它),但它可能更接近你想要的......