【问题标题】:.NET Dynamic Objects with Reflection.NET 带反射的动态对象
【发布时间】:2008-10-10 18:54:51
【问题描述】:

如何通过反射确定Nullable(of Enum) 是否确实是Enum

我正在使用从数据库调用中检索到的IDataReader 动态填充类型为T 的对象的方法。从本质上讲,它循环遍历数据读取器的序号,以及T 的所有属性,并填充与序号名称匹配的属性(还引发了一些属性魔术来更改列名)。在其他所有情况下,它都很好用,但是当我检查属性的BaseType 时,我发现System.Enum 却是System.ValueType 因此,我的枚举检查失败并且方法炸弹。

[编辑: Type.IsEnum 无法满足我的需要。这里的主要问题是,T 的 BaseType 层次结构中没有任何内容表明它是Enum。就好像让它成为 Nullable 类型就失去了我的 Enum 权利。]

有什么想法吗?

【问题讨论】:

    标签: .net reflection enums nullable


    【解决方案1】:

    有点麻烦:

    • PropertyInfo.PropertyType获取类型
    • 测试IsGenericType
    • 如果是,用GetGenericTypeDefinition()获取泛型
    • 如果该类型等于 typeof(Nullable<>),则您有一个 Nullable
    • 使用Nullable.GetUnderlyingType(propertyInfo.PropertyType)获取底层(即Enum)类型

    【讨论】:

    • 今天在工作中,我用 COM 类型做了一些反射的事情。叹。泛型类型似乎并没有更好,即使它们是托管的;)
    • 老实回答我的朋友。这是它的 if 语句: var property = [mytype].GetType().GetProperty([propertyname]); if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable) && typeof(Enum).IsAssignableFrom(Nullable.GetUnderlyingType(property.PropertyType)))
    【解决方案2】:

    您的问题不清楚。您可以使用.HasValue 来查找 Nullable 是否具有 Enum 或者它是否为 null,但这似乎不是您提出问题的目的。您是否使用反射来获取变量的类型并将 IDataReader 的数据从 Object 转换为该类型?

    【讨论】:

      【解决方案3】:

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

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

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2013-10-08
          • 1970-01-01
          • 1970-01-01
          • 2013-09-19
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          • 2011-05-28
          相关资源
          最近更新 更多