关于c#4.0:使用具有无参数构造函数约束的泛型类型的接口?

Using an interface for a generic type with parameterless constructor constraint?

我有一个泛型类,比如myCollection,它需要它的泛型类型t有一个无参数的构造函数。我有一个接口imyinterface,其中所有实现都有无参数的构造函数,但我不能将这一事实告诉编译器,因此我不能将imyinterface用作类型参数t。我应该怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
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,并删除新的参数约束,然后将该接口用作泛型参数。


另一种处理必须能够构造泛型类型的东西但由于任何原因不能使用新约束的泛型类的方法是将工厂传递给必须创建泛型类型的新对象的方法,或者将工厂作为实现它的类提供cr方法的接口的一部分。再吃一次。例如,第一个用法可以定义一个接口ifactoryFromstring,其中包含一个方法"t createfromstring(string st)",并将这样的工厂传递给一个需要能够创建给定字符串t的例程。例如,在第二个用法中,作为树节点的某个对象的接口可能包括创建另一个类似树节点的方法。第二种用法避免了对其他工厂类和参数的需要,但要求一个类的实例实际满足约束,以便生成另一个类。