使用通用基类作为方法的参数

时间:2012-09-19 12:38:58

标签: c# .net mono derived-class generic-type-argument

我有以下课程

public class A<T>
{
}
public class B<T> : A<T>
{
}
public class C1 : B<string>
{
}
public class C2 : B<int>
{
}

我想要的是,有一种方法可以将B<T>派生的任何类作为参数,例如C1C2。但是将方法声明为

public void MyMethod(B<T> x)

不起作用,它会产生编译器错误

  

错误CS0246:找不到类型或命名空间名称“T”。您是否缺少using指令或程序集引用? (CS0246)

我很困惑。为B<T>创建非通用基类将无效,因为我无法从A<T>那样派生。我能想到的唯一(丑陋)解决方案是定义一个由B<T>“实现”的空虚拟接口。有更优雅的方式吗?

3 个答案:

答案 0 :(得分:10)

使用通用方法:

public void MyMethod<T> (B<T> x)

你可以这样称呼它:

MyMethod(new B<string>());
MyMethod(new C1());
MyMethod(new C2());

答案 1 :(得分:4)

在方法上指定T

public void MyMethod<T>(B<T> x)

或者可能在包含该方法的类上:

public class Foo<T>
{
    public void MyMethod(B<T> x){}
}

在这两种情况下,您都需要在原始类上指定相同的类型约束(如果有)

答案 2 :(得分:3)

更改方法的签名,如下所示:

public void MyMethod<T>(B<T> x)