试图将标志枚举解析为字符串

时间:2014-10-01 20:15:54

标签: c# parsing generics enums

我有一个班级"许可证"这是一堆枚举标志的集合:

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是什么,怎么可能呢?

1 个答案:

答案 0 :(得分:29)

您应该使用FlagsAttribute,这会使内置的ToStringEnum.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);