gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:28:59 27 4
gpt4 key购买 nike

我有一个类“license”,它是一组像这样的枚举标志的集合:

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”的值,例如 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 是什么,它怎么可能呢?

最佳答案

你应该使用 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);

关于c# - 试图将标志枚举解析为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com