如何在C#中进行静态转换?

sco*_*obi 3 c# type-conversion

鉴于这样的几种类型:

interface I {}
class C : I {}
Run Code Online (Sandbox Code Playgroud)

如何进行静态类型转换?我的意思是:我如何以在编译时检查的方式更改其类型?

在C++中你可以做到static_cast<I*>(c).在C#中,我能做的最好是创建备用类型的临时变量并尝试分配它:

var c = new C();
I i = c;  // statically checked
Run Code Online (Sandbox Code Playgroud)

但是这会阻止流畅的编程.我必须创建一个新的变量来进行类型检查.所以我已经确定了这样的事情:

class C : I
{
    public I I { get { return this; } }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以静态转换C到我刚好打电话c.I.

在C#中有更好的方法吗?

(如果有人想知道我为什么要这样做,那是因为我使用显式接口实现,并且从另一个成员函数中调用其中一个需要首先转换为接口类型,否则编译器无法找到该方法.)

UPDATE

我想出的另一个选项是对象扩展:

public static class ObjectExtensions
{
    [DebuggerStepThrough]
    public static T StaticTo<T>(this T o)
    {
        return o;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以((I)c).Doit()也可以c.StaticTo<I>().Doit().嗯...可能仍然坚持简单演员.想想我还是会发布这个其他选项.

Max*_*xem 5

简单地投下它:

(I)c
Run Code Online (Sandbox Code Playgroud)

编辑示例:

var c = new C();

((I)c).MethodOnI();
Run Code Online (Sandbox Code Playgroud)

  • 现在,我考虑了更多,编译器将跳过静态类型检查的一种小方法。假设您从一个对象开始。可以将其强制转换为没有错误的任何东西,而我上面在问题中添加的扩展方法`StaticTo &lt;T&gt;`会捕获这种错误的强制转换。一个小问题。 (2认同)