我有一个方法,它接受一个接口对象的参数
像这样
private void SomeMethod(InterfaceA IUA)
在方法内部我有这样的声明
ClassD someVar = (ClassD)(((ClassC)((ClassB)IUA)).D);
一切都很精致和花花公子.但是,在某些情况下,对象IUA可能是ClassZ的实例而不是ClassB.所以在这种情况下上面的行错误了.在执行上述语句之前,有没有办法找出对象真正属于哪个类?如果我事先知道那么我可以有一个If语句并执行以下操作
ClassZ someVar = (ClassD)(((ClassC)((ClassZ)IUA)).Z);
我来自java背景...在java中我知道我们有getClass()...在.net中会有什么相同的东西?
你真的不应该没有充分理由编写这样的代码.
那说:你可以使用 is
if (a is ClassB) { ClassB b = (ClassB)a; } else if (a is ClassZ) { ClassZ z = (ClassZ)a; }
......或者as
:
ClassB b = a as ClassB; if (b != null) { // ... }
嗯,首先,你是不是真的应该从接口垂头丧气的一类,除非你有一个真正好的理由这样做.如果您需要ClassD功能,那么您的方法应该接收ClassD,而不是InterfaceA.
令我困惑的另一件事是多次向下倾斜.我同时使用Java和C#,我从未见过需要像这样进行多重演员.
最后,您可以使用运算符"is"来确定某些类型是从某个类继承还是实现某个接口,如
if (IUA is ClassD) { // do something }