我有一个模板类:
public abstract class Base<T> where T : IConvertible {}
和派生类:
public enum Vals1{}
public class Der1: Base<Vals1> {}
public enum Vals2{}
public class Der2: Base<Vals2> {}
我想编写一个返回Der1
或Der2
实例的方法,但我不知道哪个。
我尝试过这样的事情:
private Base<T> GetDer() where T : IConvertible
{
if (condition)
return new Der1();
return new Der2();
}
但是我得到了错误:
Cannot implicitly convert type 'Der1' to 'Base<T>'
Cannot implicitly convert type 'Der2' to 'Base<T>'
铸造也无济于事。它会返回相同的错误,只是没有单词“隐式”。
有没有一种方法可以简单地做我想做的事情,或者我必须找到其他更费劲的方法?
在此先感谢您的帮助。
答案 0 :(得分:0)
如果您创建了另外一个非通用的Base
类,则可以从中继承Base<T>
。
public abstract class Base {}
public abstract class Base<T> : Base where T : IConvertible {}
然后您的方法变为:
private Base GetDer()
{
if (condition)
return new Der1();
return new Der2();
}
这是关于在继承层次结构中查找或添加公共祖先(不是object
...)。当然,您会丢失信息,因为调用GetDer()
时会丢失类型信息。
如果以后要在返回的对象上调用的方法不需要T
的值,则应将这些方法从Base<T>
移到Base
类,以便您仍然可以使用它们。
如果要调用的方法需要已定义的T
,那么除了在运行时使用某种反射来推断T
的类型外,我看不到其他方法dynamic
关键字绕过编译时检查:
public abstract class Base<T> : Base where T : IConvertible {
abstract void MethodFromBaseT();
}
...
dynamic myObject = GetDer();
myObject.MethodFromBaseT(); //does compile
请注意,您必须使用dynamic
,因为返回的类型基本上是未知的,因为正如注释中所述,两个不同的Base<T>
和不同的T
是两个不同的类型,它们不会彼此继承。