使用泛型类型的超类的通用方法?

时间:2012-12-09 07:57:37

标签: c# generics

假设我有一个通用类:

public class MyGenericClass<T> { 
  ...
}

现在在这个类中,我希望有一个允许我与另一个泛型进行交互的方法,该泛型可以是泛型类型T或任何超类T,例如:

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

你会怎么做?

2 个答案:

答案 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>
{
  ...
}

这样我在保持向后兼容性的同时获得了所需的功能,即使用原始单一类型泛型的所有现有代码仍然有效。