【问题标题】:How to compare types如何比较类型
【发布时间】:2017-08-19 17:19:09
【问题描述】:

快速问题:如何在 C# 中将 Type 类型(不是双关语)与另一种类型进行比较? 我的意思是,我有一个Type typeField,我想知道它是否是System.StringSystem.DateTime 等,但typeField.Equals(System.String) 不起作用。

有什么线索吗?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    试试下面的

    typeField == typeof(string)
    typeField == typeof(DateTime)
    

    C# 中的typeof 运算符将为您提供指定类型的Type 对象。 Type 实例与 == 运算符相当,因此这是比较它们的好方法。

    注意:如果我没记错的话,在某些情况下,当涉及的类型是嵌入到程序集中的 COM 接口(通过 NoPIA)时,这种情况会发生故障。听起来好像不是这里的情况。

    【讨论】:

    • 我认为这会起作用,如果您要比较的两个对象是值类型。如果它们是对象类型,我不相信这会起作用。如果我错了,请纠正我。
    • @Rod 据我所知,经过一些篡改后,您的假设是正确的。一个非常肮脏的解决方法是比较每个参数的ToString() 结果。
    【解决方案2】:

    您可以使用 is operator。然后您可以通过以下方式检查对象是否为特定类型:

    if (myObject is string)
    {
      DoSomething()
    }
    

    【讨论】:

    • 对我们来说是“is”还是“typeof”更好?
    • @BrentWaggoner 这个答案可能太晚了。 is 关键字和 typeof 似乎表现不同,例如,我有一个从 BaseClass 派生的 BaseClassDerivedClass。如果我声明一个名为var testClass = new DerivedClass(); 的变量,那么我比较像if (testClass is BaseClass),结果将是true,但如果我像if (testClass.GetType() == typeof(BaseClass)) 比较结果将是false。总之,如果需要显式比较派生类,请使用typeof
    【解决方案3】:

    您可以使用以下方法比较完全相同的类型:

    class A {
    }
    var a = new A();
    var typeOfa = a.GetType();
    if (typeOfa == typeof(A)) {
    }
    

    typeof 返回给定类的 Type 对象。

    但是如果你有一个类型 B,它继承自 A,那么这个比较是错误的。而你正在寻找IsAssignableFrom

    class B : A {
    }
    var b = new B();
    var typeOfb = b.GetType();
    
    if (typeOfb == typeof(A)) { // false
    }
    
    if (typeof(A).IsAssignableFrom(typeOfb)) { // true
    }
    

    【讨论】:

      【解决方案4】:

      如果您的实例是Type

      Type typeFiled;
      if (typeField == typeof(string))
      { 
          ... 
      }
      

      但如果您的实例是object 而不是Type,请使用as 运算符:

      object value;
      string text = value as string;
      if (text != null)
      {
          // value is a string and you can do your work here
      }
      

      这样做的好处是将value 只转换一次到指定的类型。

      【讨论】:

        【解决方案5】:

        http://msdn.microsoft.com/en-us/library/system.type.gettype.aspx

        Console.WriteLine("typeField is a {0}", typeField.GetType());
        

        这会给你类似的东西

        typeField is a String
        
        typeField is a DateTime
        

        http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx

        【讨论】:

          猜你喜欢
          • 2010-12-29
          • 2011-08-27
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 2015-02-10
          相关资源
          最近更新 更多