2012-12-09 209 views
1

比方说,我有一个泛型类:使用泛型类型的超类的泛型方法?

public class MyGenericClass<T> { 
    ... 
} 

现在这个班级里面,我想有一个方法可以让我与其他一般的互动,这可能是通用型TT任何超类,例如:

public void DoSomething<T1>(List<T1> things) 
    where T : T1 // of course this won't compile 
{ 
    ... 
} 

你会如何做到这一点?

回答

5

你不能,我害怕。你能来最接近的将是具有在非通用类中的方法 - 可能的扩展方法:

public static MyGenericClassExtensions 
{ 
    public static void DoSomething<T, T1>(this MyGenericClass<T> @this, 
              List<T1> things) 
     where T : T1 
    { 
     ... 
    } 
} 

这很好,因为它同时引入两种类型的参数。

当然,一个替代方案是,以保持方法的实例方法中MyGenericClass<T>,没有约束,并检查在执行时该约束。这对于泛型的编译时安全性和一般声明性而言是不幸的,但它最终可能会为你更好地工作。

+0

有趣的是,因为约束'where T1:T'被允许。任何想法为什么OPs约束不被允许? –

+0

@mikez:是的--OP的约束在'T'上,它不是该方法的类型参数。在我的方法中,两个类型约束同时引入,因此您可以基于另一个约束一个约束。 –

+0

+1嘿乔恩,谢谢你的回答。只是觉得你想要一个ping来看看我想出的替代答案。 –

0

@ JonSkeet的回答,一如既往,是上的标记,但我没有找到另一种方式来做到这一点没有在我的代码引起的任何动荡。我创造了另一个泛型类和修改现有的类,如下所示:

public class MyGenericClass<T, TBase> 
    where T : TBase 
{ 
    public void DoSomething(List<TBase> things) 
    { 
    ... 
    } 
} 

public class MyGenericClass<T> : MyGenericClass<T, T> 
{ 
    ... 
} 

这样,我得到了所需的功能,同时仍然保持向后兼容性,即使用原来的单式通用仍然会工作即所有现有的代码。

+1

这是假设你只希望能够为任何给定的MyGenericClass实例调用一个'TBase'类型。目前尚不清楚这种限制是否可以接受。 –

+0

@JonSkeet - 真实,公平的点。如果你想允许任何基类,你的答案仍然会赢。 –