假设我有一个通用类:
public class MyGenericClass<T> {
...
}
现在在这个类中,我希望有一个允许我与另一个泛型进行交互的方法,该泛型可以是泛型类型T
或任何超类T
,例如:
public void DoSomething<T1>(List<T1> things)
where T : T1 // of course this won't compile
{
...
}
你会怎么做?
答案 0 :(得分:5)
你不能,我害怕。你最接近的可能是在非泛型类中有一个方法 - 可能是一个扩展方法:
public static MyGenericClassExtensions
{
public static void DoSomething<T, T1>(this MyGenericClass<T> @this,
List<T1> things)
where T : T1
{
...
}
}
没关系,因为它同时引入了两个类型参数。
当然,另一种方法是在没有约束的情况下将方法作为实例方法保留在MyGenericClass<T>
内,并在执行时检查约束。这对于泛型的编译时安全性和一般声明性质而言是不幸的,但它可能最终会为你做得更好。
答案 1 :(得分:0)
@ JonSkeet的答案一如既往地在标记上,但我确实找到了另一种方法来做到这一点,而不会在我的代码中造成任何动荡。我创建了另一个泛型类并修改了现有的类,如下所示:
public class MyGenericClass<T, TBase>
where T : TBase
{
public void DoSomething(List<TBase> things)
{
...
}
}
public class MyGenericClass<T> : MyGenericClass<T, T>
{
...
}
这样我在保持向后兼容性的同时获得了所需的功能,即使用原始单一类型泛型的所有现有代码仍然有效。