繁体   English   中英

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

[英]Trying to parse a flag enum to string

我有一个类“许可证”,它是一堆枚举标志的集合,如下所示:

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”和“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;
}

它说T不包含“HasFlag”的定义,但如果它不知道T是什么,它怎么可能呢?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM