PropertyInfo.GetValue返回枚举常量名而不是值

时间:2012-08-14 13:33:16

标签: c# reflection

我正在构建一个使用反射来构建序列化数据的序列化组件,但是我从枚举属性中获得了奇怪的结果:

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获取变量的实际值,即使它是枚举且只有一个值吗?

由于

2 个答案:

答案 0 :(得分:4)

正在获得真正的价值 - 它只是转换为一个没有达到预期效果的字符串。 prop.GetValue返回的值将是带框的eDayFlags值。

你想要enum中的数值吗?将其投放到int。您可以将枚举值取消装箱到其基础类型。

请注意,您的枚举 - 可能应该被称为Days - 应该[Flags]应用于它,因为 是一个标记枚举。

答案 1 :(得分: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);