假设有以下几种类型:
interface I {}
class C : I {}
如何进行静态类型转换?我的意思是:如何以一种在编译时检查其类型的方式改变它的类型?
在C++中,您可以这样做:static_cast<I*>(c)
。在C#中,我能做的最好方法是创建一个替代类型的临时变量并尝试分配它:
var c = new C();
I i = c; // statically checked
但是这会影响编程的流畅性。我必须创建一个新变量来进行类型检查。因此,我选择了类似于以下方式:
class C : I
{
public I I { get { return this; } }
}
现在我可以通过调用c.I
来将C静态转换为I。
在C#中有更好的方法吗?
(如果有人想知道我为什么要这样做,那是因为我使用显式接口实现,从另一个成员函数内调用其中一个需要先将其转换为接口类型,否则编译器无法找到该方法。)
更新
我想到的另一种选择是对象扩展:
public static class ObjectExtensions
{
[DebuggerStepThrough]
public static T StaticTo<T>(this T o)
{
return o;
}
}
因此,((I)c).Doit()
也可以写成 c.StaticTo<I>().Doit()
。嗯...可能还是会坚持使用简单的强制类型转换。不过我想把这个其他选项也发布出来。
StaticTo<T>
将捕获这样的错误转换。这只是一个小细节。 - scobi