C#中与Java的isInstance()相当的是什么?

95

我知道使用 isas 来进行 instanceof 判断,但是反射中的 isInstance() 方法如何使用呢?

5个回答

192
bool result = (obj is MyClass); // Better than using 'as'

1
它适用于使用继承的类吗?(new Child() is Parent) - Tomáš Zato
1
测试过了,对于使用继承的类有效。谢谢! - Guilherme Golfetto

57

在C#中,与Java中obj.getClass().isInstance(otherObj)等同的代码如下:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
请注意,尽管 Java 和 C# 都使用对象的运行时类型对象(Java 的 java.lang.Class ≣ C# 的 System.Type)来处理一个 obj(通过 .getClass().getType()),但是 Java 的 isInstance 接受一个对象作为其参数,而 C# 的 IsAssignableFrom 则期望另一个 System.Type 对象。

1
注意IsAssignableFrom需要一个Type类型的参数,而不是一个对象,所以你需要实际调用OtherObj.getType()方法。 - FlySwat
3
谢谢Jon - 记住,这是一个维基!我不会反感别人纠正我的错误。 - Konrad Rudolph
1
有趣的是,在Java中,JVM对"instanceof"进行了特殊处理,显然它非常非常快,这可能解释了为什么它通常是一个关键字(Java中也有一个isAssignable方法)。 - Michael Neale
为什么这个方法比更易读的“is”运算符更好? - Timothy Gonzalez
1
@TimothyGonzalez 因为它执行不同的操作。它测试两个变量是否具有相同的类型。相比之下,is需要一个类型名称。这就是OP想要的:Java的isInstance等效物。尽管另一个答案获得了荒谬的赞数,但它是错误的。 - Konrad Rudolph

39

这取决于情况,如果您不想使用转换的结果,则使用is,如果您想使用,则使用as。您几乎永远不会想要编写:

if(foo is Bar) {
    return (Bar)foo;
}

用这个代替:

var bar = foo as Bar;
if(bar != null) {
    return bar;
}

2
以下代码可以作为“IsAssignableFrom”的替代方案。
parentObject.GetType().IsInstanceOfType(inheritedObject)

请参阅MSDN中Type.IsInstanceOfType的说明。


2
仅凭我个人的想法,您还可以执行以下操作:

bool result = ((obj as MyClass) != null)

我不确定哪个表现更好。我会让别人来进行基准测试 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接