带有Flags属性的友好枚举字符串
本文关键字:枚举 字符串 Flags 属性 带有 | 更新日期: 2023-09-27 18:06:27
在仔细阅读了一些关于在c#中为枚举值创建友好字符串访问的常见方法的其他问题之后,这个答案似乎是我对通用解决方案的最佳选择,其中友好字符串可以使用DescriptionAttribute
s放置在枚举的定义中。
我将其实现为一个扩展方法,但很快意识到它只适用于没有指定[Flags]
属性的标准枚举。对于存在该属性的情况,我不完全确定实现该功能的最佳方法。
由于flags属性意味着可以同时选择多个值,因此使用单个"友好字符串"是没有意义的。我正在考虑以同样的方式定义友好字符串,但重载扩展方法以采用特定的enum类型,它将返回List<string>
以为所有选定的值提供友好字符串。
上面描述的解决方案可以工作,但是我觉得会有很多代码重复,因为每个使用Flags属性的枚举都需要它自己的扩展方法,因为枚举只能由System.Enum
继承,从而消除了我创建基本类型的能力。如果我能有一个更通用的方法,可以通过检查枚举来处理这个问题,如果flags属性存在,然后返回以下其中一个:
- 单个字符串(如果没有标志),列表(如果有标志)-签名返回
object
- 单个字符串(如果没有标志),列表(如果有标志)-签名返回
dynamic
如果未指定flags,则 - 列表可能只包含一个值-签名返回
List<string>
我觉得这个问题可能是一个"鱼与熊掌兼得"的情况,因为我希望在获得友好字符串并删除代码后不必做额外的检查。有没有一种技巧或好方法可以做到这一点,而不是一个混乱的黑客?
您可以编写一个方法,就像您链接的答案一样,但支持标志枚举,并返回一个逗号分隔的字符串,如:
public static string GetDescription(Enum value)
{
Type type = value.GetType();
var values = Enum.GetValues(type);
var setValues = new List<Enum>();
foreach(var enumValue in values)
{
if (value.HasFlag((Enum)enumValue))
setValues.Add((Enum)enumValue);
}
var stringList = new List<string>();
foreach (var singleValue in setValues)
{
var name = Enum.GetName(type, singleValue);
if (name != null)
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr =
Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
{
stringList.Add(attr.Description);
}
}
}
}
return string.Join(",", stringList.ToArray());
}
不是最干净的代码,但你明白了,只记住我的想法,它不会像预期的那样工作,对于不是标志的枚举-只是抛出一个想法。
使用enum.ToString()
获得"不友好"字符串(其中enum是您的enum变量)。编写一个可重用的扩展方法,将UnfriendlyString转换为友好的"不友好的字符串"(例如,在有大写或类似的地方插入空格小写)。
对于[Flags]
,您可以Split
不友好字符串,转换每个子字符串,或者再次Join
;或者您的扩展方法可以考虑逗号。