代码之家  ›  专栏  ›  技术社区  ›  Wes P

带有反射的.NET动态对象

  •  1
  • Wes P  · 技术社区  · 16 年前

    如何确定 Nullable(of Enum) 确实是 Enum 通过反思?

    我正在使用一个动态填充类型为的对象的方法 T 用一个 IDataReader 从数据库调用中检索。从本质上讲,它循环遍历数据读取器的序号以及 T 并填充与序号名称匹配的属性(也会抛出一些属性魔力来更改列名)。在其他任何情况下,它都很有效,但是当我检查财产的时候 BaseType 对于 System.Enum 相反,我发现, System.ValueType 结果,我的枚举检查失败,方法被破坏了。

    [编辑: Type.IsEnum 不符合我的需要。这里的主要问题是 T 的baseType层次结构表示 枚举 . 就好像把它变成 Nullable 类型没收我的 枚举 权利。

    有什么想法吗?

    4 回复  |  直到 16 年前
        1
  •  7
  •   OregonGhost    16 年前

    这有点麻烦:

    • 从中获取类型 PropertyInfo.PropertyType
    • 测试 IsGenericType
    • 如果是,则使用 GetGenericTypeDefinition()
    • 如果类型等于 typeof(Nullable<>) ,您有一个可以为空的
    • 获取底层(即 Enum 键入 Nullable.GetUnderlyingType(propertyInfo.PropertyType)
        2
  •  0
  •   Dan Goldstein    16 年前

    你的问题不清楚。你可以使用 .HasValue 找出nullable是否有枚举或者它是空的,但这似乎不是您问题的目的。是否使用反射获取变量的类型并将IDataReader的数据从对象强制转换为该类型?

        3
  •  0
  •   Zachary Yates    16 年前

    从IDataReader返回的列是否始终可以为空?如果是这样,检查的简单方法可能是:

    AnEnum? enumObj;
    if (enumObj.HasValue)
    {
      enumObj.Value.GetType().IsEnum();
    }
    

    希望有帮助。

        4
  •  0
  •   GregC Benjamin Baumann    16 年前

    我也觉得这个问题不太清楚。我在我们的生产代码中使用了Oregonghost的技巧。当枚举列表很小时是很好的,但随着层次结构的增长(读取超过100个条目)会变慢。

    当继承层次结构中存在跨多个类的概念(例如表示类中字段/属性的枚举)时,我还喜欢使用枚举值链接:

    class Base
    {
      enum BaseEnum
      {
       Val1,
       Val2,
       LastVal
      }
    }
    
    class Derived
    {
      enum DerivedEnum
      {
        Val3 = BaseEnum.LastVal,
        Val4,
        LastVal
      }
    }