我知道标题可能有点混乱,但让我解释一下我想要完成的事情。
我们假设我有类
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 来管理某些内容?
答案 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>