与Java的isInstance()等效的C#是什么?


Answers:


52

obj.getClass().isInstance(otherObj)C#中的Java等效项如下:

bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());

请注意,尽管Java和C#都在(通过vs )的运行时类型对象(java.lang.ClassJava≣C#System.Type)上工作,但Java的将一个对象作为其参数,而C#则需要另一个对象。obj.getClass().getType()isInstanceIsAssignableFromSystem.Type


1
注意IsAssignableFrom采用类型,而不是对象,因此您实际上需要执行OtherObj.getType()。
FlySwat

3
谢谢乔恩-记住,这是一个维基!我不讨厌别人纠正我的错误。
康拉德·鲁道夫

1
有趣的是……在Java中,JVM特别对待“ instanceof”,显然非常快,这可以解释为什么它异常地是关键字(java中还有isAssignable方法)。
Michael Neale

为什么此方法比可读性更高的“ is”运算符更好?
蒂莫西·冈萨雷斯

@TimothyGonzalez因为它做了一些不同的事情。它测试两个变量是否具有相同的类型。is相比之下,需要一个类型名称。这就是OP想要的:与Java等效isInstance。尽管支持投票的数目可笑,但另一个答案却是错误的。
康拉德·鲁道夫2016年


39

取决于,is如果不想使用转换的结果,请使用,as如果愿意,请使用。您几乎不想写:

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

代替:

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

2

就在我头顶上,您也可以执行以下操作:

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

不知道哪个会更好。我将它留给其他人进行基准测试:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.