如何将泛型类型指定为泛型方法中的限制

Kon*_*man 2 .net c# generics

我有一个像这样的泛型类:

class MyGenericClass<T> { }
Run Code Online (Sandbox Code Playgroud)

另一方面,我有一个聚合器类,我用它来获取MyGenericClass派生类的单例实例,其中每个实例由具体类类型和参数类型标识.也就是说,MyGenericClass<int>是从不同的MyGenericClass<string>和从MyDerivedGenericClass<int>; 每个都有一个单独的实例.

聚合器的主要成员是GetInstanceOf方法,它将返回指定类型的单例实例.问题是我想将类型指定为泛型参数,但我找不到一种方法来创建类型限制"参数必须是MyGenericClass(或派生)类型的任何参数类型".简而言之,我想要这样的事情:

T GetInstanceOf<T>() where T : MyGenericClass<> //This does not compile
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么办?有没有办法指定这样的限制?

编辑:GetInstanceOf<T>方法确实返回T,而不是void.

Aar*_*ieb 6

您可能想要创建一个接口,并让您的泛型类实现它..NET编译器将MyGenericClass <int>和MyGenericClass <string>视为完全不同的类.

这可以让你做这样的事情:

void GetInstanceOf<T>() where T : IMyGenericClass
Run Code Online (Sandbox Code Playgroud)

您还可以使用共享基类:

void GetInstanceOf<T>() where T : MyGenericClassBase
Run Code Online (Sandbox Code Playgroud)

最后,您可以尝试在方法中添加第二个类型参数:

void GetInstanceOf<T, U>() where T: MyGenericClassBase<U>
Run Code Online (Sandbox Code Playgroud)

(我不确定最后一个......我没有编译器方便检查它)

请参阅:http://msdn.microsoft.com/en-us/library/aa479859.aspx#fundamentals_topic12