【问题标题】:How to determine if Type is a struct?如何确定 Type 是否为结构?
【发布时间】:2010-02-01 11:29:20
【问题描述】:

给定一个PropertyInfo 实例,它有一个Type 属性,如何确定它是否是一个结构?发现有IsPrimitiveIsInterface等属性,但是不知道怎么求struct?

编辑: 澄清问题。 假设我有一个方法:

public Boolean Check(PropertyInfo pi)
{
   return pi.Type.IsStruct;
}

我写什么而不是IsStruct

【问题讨论】:

    标签: c# .net types struct


    【解决方案1】:

    Type.IsValueType 应该可以解决问题。

    (来自here

    【讨论】:

    • 谢谢。我想我还必须检查 !IsPrimitive,但这应该可以解决问题。
    • @Dejan:原语(如布尔值)也是结构体。
    • 你是对的,你需要 !IsPrimitive。扩展方法呢? :D
    • @Fredrik:谢谢,我知道 - 但我只需要检查“自定义”结构,所以我最终得到类似:return type.IsValueType && !type.IsPrimitive && type != typeof (十进制);适合这种特殊需求。
    • 为了解决 typeof(Decimal) 之类的问题,我决定在一个项目中排除所有以“System”开头的类型。 - 这是我项目中正确的做法。也许对你有帮助。
    【解决方案2】:

    结构和枚举 (IsEnum) 属于称为值类型 (IsValueType) 的超集。原始类型 (IsPrimitive) 是结构的子集。这意味着所有原始类型都是结构,但反之则不然;例如,int 是原始类型和结构,但decimal 只是结构,而不是原始类型。

    所以你看到唯一缺少的属性是结构体。容易写一个:

    public bool IsStruct(this Type type)
    {
       return type.IsValueType && !type.IsEnum;
    }
    

    【讨论】:

      【解决方案3】:

      将 Antony Koch 的答案中的 cmets 放入扩展方法中:

      public static class ReflectionExtensions {
              public static bool IsCustomValueType(this Type type) {            
                     return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System.");
              }
          }
      

      应该工作

      【讨论】:

      • 考虑是否要包含或排除 IsEnum — 如果您只是在寻找自定义结构。
      猜你喜欢
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2015-12-07
      • 2011-07-12
      • 2019-12-31
      • 1970-01-01
      相关资源
      最近更新 更多