2012-08-14 127 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

相关问题