c#4.0-为具有无参数构造函数约束的泛型类型使用接口



我有一个泛型类,比如MyCollection<T>,需要其泛型类型T的具有无参数构造函数。我有一个接口IMyInterface,所有实现都有无参数构造函数,但我不能告诉编译器这个事实,所以我不能使用IMyInterface作为类型参数T。我该怎么办?

public class MyCollection<T> where T : new()
{
    bla bla ...
    T t = new T();
}
public interface IMyInterface
{
    bla bla ...
}
...
MyCollection<IMyInterface> x;   //Compile Time Error

我知道在定义构造函数签名的接口中也问过几乎相同的问题?但它已经两年了,我希望也许有人能在C#4.0中提出一个变通方法。

这将不起作用,因为接口为t的T t = new T();将变成完全无效的IMyInterface t = new IMyInterface();。您必须知道构造您的类型的具体实现是什么。不能将抽象类型或接口单独用于new。如果MyCollection是您自己的类,如果您在构造函数中添加了一个参数,通过传入具体实现来在构造函数中设置T t,并删除新的参数约束,然后将接口用作泛型参数。

处理泛型类的另一种方法是将工厂传递给必须创建泛型类型的新对象的方法,或者作为接口的一部分,要求实现它的类提供创建另一个实例的方法。例如第一种用法,可以定义接口IFactoryFromString<T>它包括一个方法"T CreateFromString(String st)",并将这样的工厂传递给一个例程,该例程需要能够在给定字符串的情况下创建T。例如,例如第二种用法,行为为树节点的东西的接口可能包括创建另一个类似树节点的方法。第二种用法避免了对额外的工厂类和参数的需要,但需要一个类的实例满足约束才能生成另一个实例。

最新更新