我有一个接受类型 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
应该有一个带有指定参数的构造函数。基类有一个带有一些参数的构造函数这一事实并没有帮助,因为重写的类没有have to具有相同的构造函数(例如,它可以使用某个值作为参数来调用基本构造函数)。
The 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
方法在这个版本中涉及更多一些,因为你必须显式指定工厂(并且你也需要实现它),但它可能更接近你想要的......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)