use*_*993 9 c# generics enums parsing
我有一个类"许可证",它是一堆枚举标志的集合,如下所示:
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...
}
Run Code Online (Sandbox Code Playgroud)
关键是可以将相同类别的各种标志一起进行"或"运算,以形成用户可以对所述许可证执行的操作的配置文件.现在我试图以人性化的方式显示"Usage"和"Platform"的值,例如,如果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;
}
Run Code Online (Sandbox Code Playgroud)
它说T不包含"HasFlag"的定义,但如果它不知道T是什么,它怎么可能呢?
Tim*_* S. 32
你应该使用FlagsAttribute,这会导致内置ToString和Enum.Parse方法按照你想要的方式工作.还要注意,约定是标志枚举名称应该是复数,所以例如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);
Run Code Online (Sandbox Code Playgroud)