很奇怪,调试器中的值与ToString值不同。根据文档,两者应该匹配(因为Enum类型确实会覆盖ToString)。
如果 C# 对象有一个覆盖ToString(),调试器将调用覆盖并显示其结果而不是标准的{<typeName>}.
显然这不适用于枚举。我最好的猜测是调试器正在尝试对枚举类型进行一些特殊的、未记录的处理。添加DebuggerDisplayAttribute显然通过覆盖此行为解决了该问题。
[DebuggerDisplay("{ToString()}")]
[Flags]
public enum Categories : uint
{
...
}
Categories.F2.ToString() = "F, F2"
C# 不会为你做那个魔法,因为F2在枚举中已经有了它自己的名字。您可以像这样手动标记各个成员:
public enum Categories
{
[Description("F, F2")]
F2 = F | (1 << 24),
}
然后编写代码转换为描述。
public static string ToDescription(this Categories c)
{
var field = typeof(Categories).GetField(c.ToString());
if (field != null)
{
return field.GetCustomAttributes().Cast<DescriptionAttribute>().First().Description;
}
}
...
Categories.F2.ToDescription() == "F, F2";
或者你可以做一些魔法来自己生成这个:
public static string ToDescription(this Categories c)
{
var categoryNames =
from v in Enum.GetValues(typeof(Categories)).Cast<Category>()
where v & c == c
orderby v
select v.ToString();
return String.Join(", ", categoryNames);
}
不幸的是,扩展方法不能与 一起使用DebuggerDisplayAttribute,但你可以使用DebuggerTypeAttributeYMMV 但你可以试试这个:
[DebuggerType("CategoryDebugView")]
[Flags]
public enum Categories : uint
{
...
}
internal class CategoryDebugView
{
private Category value;
public CategoryDebugView(Category value)
{
this.value = value;
}
public override string ToString()
{
var categoryNames =
from v in Enum.GetValues(typeof(Categories)).Cast<Category>()
where v & c == c
orderby v
select v.ToString();
return String.Join(", ", categoryNames);
}
}