【发布时间】:2010-10-08 21:18:59
【问题描述】:
给定几个这样的类型:
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()。嗯......可能仍然会坚持简单的演员表。想我还是会发布这个其他选项。
【问题讨论】:
标签: c# type-conversion