2012-08-14 74 views
4

我建立使用反射來構建序列化的數據序列化成分,但我從列舉的特性越來越怪異的結果:PropertyInfo.GetValue返回枚舉常量的名稱,而不是價值

enum eDayFlags 
{ 
    Sunday = 1, 
    Monday = 2, 
    Tuesday = 4, 
    Wednesday = 8, 
    Thursday = 16, 
    Friday = 32, 
    Saturday = 64 
} 

public eDayFlags DayFlags { get; set; } 

現在的串行化的實際測試

Obj Test = new Obj(); 
Test.DayFlags = eDayFlags.Friday; 

輸出則是:

DayFlags =星期五

但是,如果我設置我的變量兩個標誌:

Obj Test = new Obj(); 
Test.DayFlags = eDayFlags.Friday; 
Test.DayFlags |= eDayFlags.Monday; 

系列化的輸出則是:

DayFlags = 34

我在做什麼的序列化組件非常簡單:

//Loop each property of the object 
foreach (var prop in obj.GetType().GetProperties()) 
{ 

    //Get the value of the property 
    var x = prop.GetValue(obj, null).ToString(); 

    //Append it to the dictionnary encoded 
    if (x == null) 
    { 
      Properties.Add(HttpUtility.UrlEncode(prop.Name) + "=null"); 
    } 
    else 
    { 
      Properties.Add(HttpUtility.UrlEncode(prop.Name) + "=" + HttpUtility.UrlEncode(x.ToString())); 
    } 
} 

任何人都可以告訴我如何從PropertyInfo.GetValue獲取變量的實際值,即使它是一個枚舉並且只有一個值?

感謝

+1

我建議使用十六進制或位移而不是十進制來表示標誌。低數字並不是什麼大問題,但爲了保持一致性,我會在任何地方進行。 – Brian 2012-08-14 17:45:58

回答

4

得到真正的價值了 - 它只是轉換爲一個字符串,是不是做你的期望。 prop.GetValue返回的值將是盒裝的eDayFlags值。

你想從枚舉數值嗎?將它投射到int。您可以將枚舉值取消裝入其基礎類型。

請注意,您的枚舉 - 這或許應該被稱爲Days - 應該具有適用於它[Flags],因爲它一個標誌枚舉。

+0

如果我嘗試將我得到的值轉換爲int,則表示我無法將其轉換爲字符串版本,而不是枚舉值。 – 2012-08-14 13:46:18

+0

@MathieuDumoulin:那將是因爲你已經調用了'ToString'。不要這樣做...... – 2012-08-14 13:47:03

+0

謝謝你現在所有的工作,那是當你複製在網絡上粘貼代碼部分會發生什麼,因爲你不知道如何完成某件事,你沒有看到.ToString( )在結尾處,並最終提出了關於這樣的問題:( – 2012-08-14 13:54:57

1

這是預期的行爲。

您沒有在您的枚舉上設置Flags屬性,因此.ToString()返回作爲其基礎類型(默認爲int)的枚舉的字符串表示形式。

添加[Flags]將迫使你.ToString()來回報您的預期值,即"Monday, Friday"


如果反編譯Enum類,你會看到如下所示的代碼在執行ToString()如下:

//// If [Flags] is NOT present 
if (!eT.IsDefined(typeof (FlagsAttribute), false)) 
//// Then returns the name associated with the value, OR the string rep. of the value 
//// if the value has no associated name (which is your actual case) 
    return Enum.GetName((Type) eT, value) ?? value.ToString(); 
else 
//// [Flags] defined, so return the list of set flags with 
//// a ", " between 
    return Enum.InternalFlagsFormat(eT, value); 
+0

不,我要INT值 – 2012-08-14 13:49:25

+0

哦,對不起,我只是注意到我正在使用TOString,複製/粘貼的奇妙世界 – 2012-08-14 13:50:29

+0

感謝[Flags]屬性,我已經標誌着另一個人是正確的,因爲他是第一個回答,你的答案都很好,謝謝你的時間 – 2012-08-14 13:55:28

相關問題