2008-10-10 100 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 
        } 
    }