abstract class A
{
public abstract object Convert();
}
class B : A
{
public override object Convert()
{
return ConvertToX();
}
public X ConvertToX()
{
return new X();
}
}
void SomeMethod()
{
A o = new B();
var result = (X)o.Convert();
}
当您知道 class 是B
, (通过ConvertToX
,因为X Convert()
不能覆盖object Convert()
)和 anobject
当您只知道它是 an 时,这可以让您获得强类型的结果A
。由于显式转换只能基于您正在使用的变量的静态类型发生,因此使用强制转换并不是一个很好的方法,就像您问的那样。
(@svick 指出了我之前的代码中的一个主要缺陷,如下所示,如果你只知道对象是 an A
,而不是 an ,你就不能轻易地用它做任何事情A<T>
。我会把它放在这里以防万一你有什么用处:)
interface IConvertible<out T>
{
T Convert();
}
abstract class A
{
}
abstract class A<T> : A, IConvertible<T>
{
public abstract T Convert();
public static explicit operator T(A<T> a)
{
return a.Convert();
}
}
class B : A<X>
{
public override X Convert()
{
// TODO implement this
}
}
如果你有一个可以转换为多种类型的类型,你可以这样做:
class B : A<X>, IConvertible<Y>
{
public override X Convert()
{
throw new NotImplementedException();
}
Y IConvertible<Y>.Convert()
{
throw new NotImplementedException();
}
}
或者:
class B : A, IConvertible<X>, IConvertible<Y>
{
X IConvertible<X>.Convert()
{
throw new NotImplementedException();
}
Y IConvertible<Y>.Convert()
{
throw new NotImplementedException();
}
}