2008-10-10 55 views
1

如何通过反射来确定Nullable(of Enum)是否确实是Enum带反射的.NET动态对象

我正在使用从数据库调用中检索的IDataReader动态填充类型为T的对象的方法。在本质上,它遍历数据记录器的序号和T的所有属性,并填充匹配序号名称的属性(也引发一些属性魔术来更改列名称)。在任何其他情况下,它的效果很好,但是当我检查BaseType的地址为System.Enum时,我发现System.ValueType因此,我的枚举检查失败,方法炸弹。

[编辑: Type.IsEnum不工作,我需要它。这里的主要问题是T的BaseType层次结构中没有任何内容说明它是Enum。这就好像使它成为Nullable类型,我的Enum权利就没收了。]

任何想法?

回答

7

这是一个有点麻烦:从PropertyInfo.PropertyType

  • 试验IsGenericType
  • 如果

    • 获取类型,得到泛型类型GetGenericTypeDefinition()
    • 如果类型等于typeof(Nullable<>),你有可为空
    • 获取底层(即Enum)类型Nullable.GetUnderlyingType(propertyInfo.PropertyType)
  • +0

    今天在工作中,我没有一些COM类型的反射事物。叹。似乎对泛型没有太大的好处,尽管它们被管理;) – OregonGhost 2008-10-10 19:20:44

    0

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

    0

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

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

    希望有所帮助。

    0

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

    我也喜欢用枚举值链接当存在跨越在继承层次多个类(例如枚举代表一个类字段/属性)一个概念:

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