【发布时间】:2010-09-21 21:35:49
【问题描述】:
我知道is 和as 用于instanceof,但是反射式isInstance() 方法呢?
【问题讨论】:
标签: c# reflection introspection instanceof
我知道is 和as 用于instanceof,但是反射式isInstance() 方法呢?
【问题讨论】:
标签: c# reflection introspection instanceof
在C#中相当于Java的obj.getClass().isInstance(otherObj)如下:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
请注意,虽然 Java 和 C# 都适用于 obj(通过 .getClass() 与 .getType())的运行时类型对象 (Java java.lang.Class ≣ C# System.Type),但 Java 的 isInstance 采用对象作为它的参数,而 C# 的 IsAssignableFrom 需要另一个 System.Type 对象。
【讨论】:
is 需要类型名称。这就是 OP 想要的:相当于 Java 的 isInstance。尽管赞成票的数量荒谬,但另一个答案完全是错误的。
就在我的脑海中,你也可以这样做:
bool result = ((obj as MyClass) != null)
不确定哪个会更好。我会留给其他人进行基准测试:)
【讨论】:
bool result = (obj is MyClass); // Better than using 'as'
【讨论】:
new Child() is Parent)
视情况而定,如果您不想使用转换结果,请使用is,如果您想使用,请使用as。你几乎不想写:
if(foo is Bar) {
return (Bar)foo;
}
代替:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
【讨论】:
下面的代码可以替代IsAssignableFrom。
parentObject.GetType().IsInstanceOfType(inheritedObject)
请参阅 MSDN 中的 Type.IsInstanceOfType 描述。
【讨论】: