【发布时间】:2014-10-01 20:15:53
【问题描述】:
我有一个“许可证”类,它是一堆枚举标志的集合,如下所示:
Public class License
{
UsageType Usage { get; set; }
PlatformType Platform { get; set; }
public enum UsageType { read = 1, write = 2, wipe = 4, all = 7 }
public enum PlatformType { windows = 1, linux = 2, ios = 4, all = 7 }
etc...
}
关键是同一类别的各种标志可以通过“或”运算来形成用户可以使用所述许可证执行的操作的概要文件。现在我正在尝试以人性化的方式显示“使用”和“平台”的值,例如 if Usage == UsageType.read | UsageType.write 那么它应该被解析为“读,写”。
我通过测试每个标志的值并将每个标志的 enumitem.ToString() 附加到字符串中,成功地使用了单个枚举类型。由于我有很多这些枚举和值,我想提出一种更通用的方法。
我想出了这个(下),但由于我对 c# 中的模板函数不是很熟悉,所以我不知道为什么这不起作用,但至少它应该说明我的意思:
private string parseEnum<T>(T value)
{
string ret = "";
foreach (var ei in (T[])Enum.GetValues(typeof(T)))
{
if (value.HasFlag(ei)) ret += ei.ToString() + ", ";
}
ret = ret.substring(0, ret.Length-1);
return ret;
}
这是说 T 不包含“HasFlag”的定义,但现在如果它不知道 T 是什么,怎么可能呢?
【问题讨论】:
-
不完全是重复的,但您遇到的问题本质上是这样的:stackoverflow.com/questions/79126/…。为该问题提供的解决方案应该可以帮助您到达需要的地方。
-
你试过
enumValue.ToString()吗? -
如果您在枚举中使用
Flags属性,您可以免费获得漂亮的打印(列出设置的每个组成标志)。 -
顺便说一句,
string.Join是防止丑陋的字符串构建循环的好方法。