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

Mat*_*lin 5 c# reflection

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

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

public eDayFlags DayFlags { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在进行真正的测试

Obj Test = new Obj();
Test.DayFlags = eDayFlags.Friday;
Run Code Online (Sandbox Code Playgroud)

序列化的输出是:

DayFlags=星期五

但是如果我在变量中设置两个标志:

Obj Test = new Obj();
Test.DayFlags = eDayFlags.Friday;
Test.DayFlags |= eDayFlags.Monday;
Run Code Online (Sandbox Code Playgroud)

序列化的输出是:

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()));
     }
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何从 PropertyInfo.GetValue 获取变量的实际值,即使它是一个枚举并且只有一个值?

谢谢

Jon*_*eet 4

正在获取真正的值 - 这只是转换为字符串,而这并没有达到您的预期。返回的值prop.GetValue将是装箱eDayFlags值。

您想要枚举中的数值吗?将其投射到int. 您可以将枚举值拆箱为其基础类型。

请注意,您的枚举(可能应该被调用Days)应该应用于[Flags]它,因为它一个标志枚举。