从通用类中的类型基类中推断类型

时间:2014-09-04 19:28:49

标签: c# asp.net oop generics reflection

我知道标题可能有点混乱,但让我解释一下我想要完成的事情。


我们假设我有

public class TestA<T>
{
    public T Key { get; set; }
}

public class TestB : TestA<int>
{
    public string Name { get; set; }
}

如您所见,TestB继承自TestA<int>,因此会继承属性public int Key


现在,让我们添加界面

public interface TestC<T> where T : TestA<X>
{
    T DoSomething(X argument);
}

这就是我遇到麻烦的地方。

我想要DoSomething方法,在T的情况下,对TestA<>TestB)的超类的类型进行论证,将是int

所以,如果我有TestC<TestB>类型的实现,我希望DoSomething签名为:

public TestB DoSomething(int argument);

问题是TestA<X>无法编译,我无法实现此目标


拜托,您知道这是否可行?如果是这样,你能解释我怎么样?

也许我可以使用 Reflection 来管理某些内容?

2 个答案:

答案 0 :(得分:2)

您只需要为您缺少的类型添加通用参数,在本例中为X

public interface TestC<T, X> where T : TestA<X>
{
    T DoSomething(X argument);
}

答案 1 :(得分:-1)

也有可能的解决方案:

public interface TestC {
    T DoSomething<T,X>(X x) where T : TestA<X>;
}

public class TestCImpl : TestC {
    public T DoSomething<T,X>(X x) where T : TestA<X>
        //Do something
        return default(T);
    }
}

这个编译,但很容易得到运行时异常,因为IntelliSense似乎不起作用并推断出x参数的类型。

例如,这两个编译:

TestC c = new TestCImpl();
c.DoSomething<TestB>(2);
c.DoSomething<TestB>("Hello");

但只有第一个应该真正起作用,因为TestB继承自TestA<int>