【问题标题】:What is the C# equivalent to Java's isInstance()?什么是 C# 等价于 Java 的 isInstance()?
【发布时间】:2010-09-21 21:35:49
【问题描述】:

我知道is 和as 用于instanceof,但是反射式isInstance() 方法呢?

【问题讨论】:

    标签: c# reflection introspection instanceof


    【解决方案1】:

    在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 对象。

    【讨论】:

    • 注意 IsAssignableFrom 需要一个类型,而不是一个对象,因此您需要实际执行 OtherObj.getType()。
    • 感谢 Jon – 请记住,这是一个 wiki!我不讨厌人们纠正我的错误。
    • 有趣...在java中,JVM对“instanceof”的处理是特殊的,显然它非常非常快,这可以解释为什么它不寻常的关键字(java中还有一个isAssignable方法)。跨度>
    • 为什么这种方法比可读性更强的“is”操作符更好?
    • @TimothyGonzalez 因为它做了一些不同的事情。它测试两个变量是否具有相同的类型。相比之下,is 需要类型名称。这就是 OP 想要的:相当于 Java 的 isInstance。尽管赞成票的数量荒谬,但另一个答案完全是错误的。
    【解决方案2】:

    就在我的脑海中,你也可以这样做:

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

    不确定哪个会更好。我会留给其他人进行基准测试:)

    【讨论】:

      【解决方案3】:
      bool result = (obj is MyClass); // Better than using 'as'
      

      【讨论】:

      • 它是否适用于使用继承的类? (new Child() is Parent)
      • 在这里测试过,它适用于用户继承的类。谢谢大佬。
      【解决方案4】:

      视情况而定,如果您不想使用转换结果,请使用is,如果您想使用,请使用as。你几乎不想写:

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

      代替:

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

      【讨论】:

        【解决方案5】:

        下面的代码可以替代IsAssignableFrom。

        parentObject.GetType().IsInstanceOfType(inheritedObject)
        

        请参阅 MSDN 中的 Type.IsInstanceOfType 描述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 2015-11-22
          • 2011-10-13
          • 1970-01-01
          相关资源
          最近更新 更多