【问题标题】:Check if instance is of a type检查实例是否属于某个类型
【发布时间】:2010-08-24 21:31:36
【问题描述】:

使用它来检查c 是否是TForm 的实例。

c.GetType().Name.CompareTo("TForm") == 0

除了使用string 作为CompareTo() 的参数之外,还有其他类型更安全的方法吗?

【问题讨论】:

  • 我当然希望你也不要在 Java 中那样做。 Java 的 instanceof 和 C# 的 is 是更好的方法。

标签: c# .net


【解决方案1】:

这里的不同答案有两种不同的含义。

如果你想检查一个实例是否是一个确切的类型那么

if (c.GetType() == typeof(TForm))

是要走的路。

如果您想知道cTForm 的实例还是子类,请使用is/as

if (c is TForm)

TForm form = c as TForm;
if (form != null)

您应该清楚自己真正想要的这些行为中的哪一种。

【讨论】:

  • 一个小提示:如果你不想使用强制转换的结果,使用“is”,如果你想使用,使用“as”。
  • 使用 C# 7,您可以将 isas 与模式匹配结合起来:if (x is TForm tf) {…
  • @AviramFireberger 你不能用if ( object is string s) 的时间
【解决方案2】:
if(c is TFrom)
{
   // Do Stuff
}

或者如果您打算将c 用作TForm,请使用以下示例:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

第二个示例只需要检查一次c 是否属于TForm 类型。如果您检查c 是否属于TForm 类型然后强制转换,CLR 会进行额外检查。 这是reference

编辑:从 Jon Skeet 那里偷来的

如果您想确保 c 属于 TForm 而不是任何继承自 TForm 的类,请使用

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}

【讨论】:

    【解决方案3】:

    是的,“是”关键字:

    if (c is TForm)
    {
        ...
    }
    

    详见 MSDN:http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

    检查对象是否与给定类型兼容。例如,可以像这样确定一个对象是否与字符串类型兼容:

    【讨论】:

      【解决方案4】:

      还有,有点类似

      Type.IsAssignableFrom(Type c)
      

      "如果 c 和当前 Type 表示相同的类型,或者如果 current 类型在 c 的继承层次中,或者如果 current Type 是 c 实现的接口,或者如果 c 是泛型类型 参数和当前的Type代表c的约束之一。”

      从这里:http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

      【讨论】:

      • 这也是我个人的最爱。 typeof(Class).IsAssignableFrom(object.getType()) 类似于 Java 的 instanceof 运算符。
      • 如果它们不在继承层次结构的同一分支中但存在转换运算符,它是否给出错误?
      • 好问题@PaulStelian。我不确定我的头顶,但我的猜测是在那种情况下它会返回一个错误。这至少是我的预期行为。可能如果存在隐式转换,它可能会返回 true,但这很奇怪。
      • 任何安装了 Visual Studio 的人尝试一下?
      • @PaulStelian - 它返回 false。这可以通过以下文档链接看到,并观察没有提及转换。另一种思考方式是T1.IsAssignableFrom(T2)as 运算符在给定这些类型的实例的情况下返回非空值的情况下返回true
      【解决方案5】:

      如果您想使用 c 作为 TForm,比其他答案更紧凑:

      if(c is TForm form){
          form.DoStuff();
      }
      

      【讨论】:

        【解决方案6】:

        试试下面的

        if (c is TForm) { 
         ...
        }
        

        【讨论】:

          【解决方案7】:

          正如其他人所提到的,“是”关键字。但是,如果您稍后将其转换为该类型,例如。

          TForm t = (TForm)c;
          

          那么你应该使用“as”关键字。

          例如TForm t = c as TForm.

          那你就可以查了

          if(t != null)
          {
           // put TForm specific stuff here
          }
          

          不要与 is 组合,因为它是重复检查。

          【讨论】:

            【解决方案8】:

            或者

            c.getType() == typeOf(TForm)
            

            【讨论】:

              【解决方案9】:
              bool isValid = c.GetType() == typeof(TForm) ? true : false;
              

              或更简单

              bool isValid = c.GetType() == typeof(TForm);
              

              【讨论】:

              • 恕我直言:我会避免直接同情(即==)。在支持继承的对象或面向语言中,除非您知道您的特定类型永远不会从例如sealed 类继承。另外:使用返回(静态/常量)布尔值的三元运算符让我感到困扰,如果它是 switch 语句,我就不会那么烦恼了。
              猜你喜欢
              • 1970-01-01
              • 2012-10-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多