c# - 通用方法 : instantiate a generic type with an argument

标签 c# generics instantiation

<分区>

我有一个接受类型 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方法在这个版本中涉及更多一些,因为你必须显式指定工厂(你也需要实现它),但它可能更接近你想要的......

关于c# - 通用方法 : instantiate a generic type with an argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3327596/

相关文章:

c# - 有没有关于 Lucene.NET 的书籍

python - 在 Python 中,从变量实例化类的正确方法是什么?

java - 为我揭开通配符的神秘面纱

swift - 在 Swift 中比较枚举

c++ - 从 C++ 中的错误模板实例化继承

C++ 模板实例化限制

c# - 确定 IDisposable 是否应该扩展接口(interface)或在实现所述接口(interface)的类上实现

c# - 使用 Rx 限制非异步调用的回调

C# 在委托(delegate)调用中等待

android - 如何使用泛型或反射来显示/隐藏 fragment ? Kotlin 安卓