我有一个班级"许可证"这是一堆枚举标志的集合:
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...
}
关键在于,可以将相同类别的各种标志组合在一起,以形成用户可以对所述许可执行的操作的配置文件。现在我试图显示" Usage"的值。和平台"平台"以人性化的方式,例如,如果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不包含&#34; HasFlag&#34;的定义。但是,如果它不知道T是什么,怎么可能呢?
答案 0 :(得分:29)
您应该使用FlagsAttribute
,这会使内置的ToString
和Enum.Parse
方法按您希望的方式工作。另请注意,约定是标记枚举名should be plural,例如, UsageTypes
代替UsageType
。
[Flags]
public enum UsageTypes { Read = 1, Write = 2, Wipe = 4, All = 7 }
[Flags]
public enum PlatformTypes { Windows = 1, Linux = 2, iOs = 4, All = 7 }
var e1 = License.UsageTypes.Read | License.UsageTypes.Write;
var s = e1.ToString();
Debug.Assert(s == "Read, Write");
var e2 = (License.UsageTypes)Enum.Parse(typeof(License.UsageTypes), s);
Debug.Assert(e1 == e2);