首页 / C# / c# – 我应该如何表示分层标志枚举?
c# – 我应该如何表示分层标志枚举?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 我应该如何表示分层标志枚举?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2456字,纯文字阅读大概需要4分钟。
内容图文
![c# – 我应该如何表示分层标志枚举?](/upload/InfoBanner/zyjiaocheng/785/87a38611bbd4411d8f185176716aec3a.jpg)
我有以下一组枚举:
[Flags]
public enum Categories : uint
{
A = (1 << 0),
B = (1 << 1),
B1 = B | (1 << 16),
B2 = B | (1 << 17),
B3 = B | (1 << 18),
B4 = B | (1 << 19),
B5 = B | (1 << 20),
C = (1 << 2),
C1 = C | (1 << 21),
D = (1 << 3),
D1 = D | (1 << 22),
D2 = D | (1 << 23),
E = (1 << 4),
F = (1 << 5),
F1 = F | (1 << 23),
F2 = F | (1 << 24),
F3 = F | (1 << 25),
F4 = F | (1 << 26),
F5 = F | (1 << 27),
G = (1 << 6),
H = (1 << 7),
H1 = H | (1 << 28),
}
这个想法是枚举表示一个层次结构,其中子枚举意味着它的父节点,并且可以应用任意数量的标志.
我看到的问题是所有子枚举都没有在调试过程中表示为名称或名称集. I.E.,Categories.F =“F”但是Categories.F2 = 16777248.我希望Categories.F2 =“F,F2”或至少“F2”
如何让我的枚举仍被识别为标志?有没有更好的方法来完成我想要做的事情?
解决方法:
调试器中的值与ToString值不同,这很奇怪.根据documentation,两者应该匹配(因为Enum类型确实覆盖了ToString).
If a C# object has an overridden
ToString()
, the debugger will call the override and show its result instead of the standard{<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一起使用,但你可以使用DebuggerTypeAttribute,YMMV,但你可以试试这个:
[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);
}
}
内容总结
以上是互联网集市为您收集整理的c# – 我应该如何表示分层标志枚举?全部内容,希望文章能够帮你解决c# – 我应该如何表示分层标志枚举?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。