我正在构建一个使用反射来构建序列化数据的序列化组件,但是我从枚举属性中获得了奇怪的结果:
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获取变量的实际值,即使它是枚举且只有一个值吗?
由于
答案 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);