1

如何通过反射确定 aNullable(of Enum)是否确实是a ?Enum

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

[编辑: Type.IsEnum不起作用我需要它。这里的主要问题是TBaseType 层次结构中没有任何内容表明它是Enum. 就好像让它成为一种Nullable类型就失去了我的Enum权利。]

有任何想法吗?

4

4 回答 4

7

有点麻烦:

  • 从获取类型PropertyInfo.PropertyType
  • 测试IsGenericType
  • 如果是,请使用以下方法获取泛型类型GetGenericTypeDefinition()
  • 如果该类型等于typeof(Nullable<>),则您有一个 Nullable
  • 获取底层(即Enum)类型Nullable.GetUnderlyingType(propertyInfo.PropertyType)
于 2008-10-10T19:18:02.373 回答
0

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

于 2008-10-10T19:18:27.240 回答
0

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

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

希望有帮助。

于 2008-10-10T19:25:47.553 回答
0

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

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

class Base
{
  enum BaseEnum
  {
   Val1,
   Val2,
   LastVal
  }
}

class Derived
{
  enum DerivedEnum
  {
    Val3 = BaseEnum.LastVal,
    Val4,
    LastVal
  }
}
于 2009-05-01T03:47:02.860 回答