像这样。
class C1<T> : I1<T> where T:class{
void M1() {}
}
class C2<T> : I1<T> where T:class,new(){
void M2() {}
void irrelevant_method{ ... new T(); ... }
}
class C3<T> where T:class {
void M3(I1<T> x){
// how to call M1 or M2?
if (x is C1<T>) (x as C1<T>).M1();
else if (x is C2<T>) (x as C2<T>).M2(); // error
}
}
它不编译 - 我们知道编译器没有的东西。如果x
是C2
,我们知道它有new()
约束,但我们无法“提升”x,因为C3本身没有new()
。
不,我不能只添加new()。我真的必须处理没有默认ctor的类。
有什么想法吗?
编辑:添加了使用新T()的无关方法,但与问题无关。
虽然问题是不重复,但事实证明答案是一样的。摆脱new()
约束并在运行时使用Activator.CreateInstance<T>()
。感谢您的链接。
答案 0 :(得分:-1)
可能你应该使用这样的想法:
interface I1<T>
{
void Some ();
}
class C1<T> : I1<T> where T:class{
public void M1() {}
public void Some()
{
}
}
class C2<T> : I1<T> where T:class{
public void M2() {}
public void Some()
{
}
}
class C3<T> where T:class {
void M3(I1<T> x){
if (x is C1<T>) (x as C1<T>).M1();
else if (x is C2<T>) (x as C2<T>).M2();
}
public void Some()
{
}
}