通用方法:使用参数实例化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
方法在这个版本中涉及更多,因为你必须明确指定工厂(并且你也需要实现它),但它可能更接近你想要的…
- VC ++在解决方案中从非/ clr项目的函数调用/ clr项目的函数
- MVC中的自定义表单身份validation
- 使用连续的TryParse调用是一种猜测字符串’真实类型’的合理方法吗?
- 在WPF中,Windows Forms中的Suspend / ResumeLayout()和BackgroundWorker()相当于什么
- 如何在运行时设置端点
- 取消HttpClient请求 – 为什么TaskCanceledException.CancellationToken.IsCancellationRequested为false?
- C#OpenFileDialog中的Stackoverflow / CLR错误
- 从任务返回而不阻止UI线程
- 插入排序c#