我希望结合使用枚举 - 按位[标志] - 以及使用结果组合的描述。我在这里使用Flags属性和使用描述属性来查看示例,但不是两者都是。
类似的东西:
[Flags]
public enum ReasonCode
{
[Description("Verified")]
None = 0,
[Description("Check A")]
Reason1 = 1,
[Description("Check B")]
Reason2 = 2,
[Description("Check C")]
Reason3 = 4,
[Description("Check D")]
Reason4 = 8,
[Description("Check E")]
Reason5 = 16,
[Description("Check F")]
Reason6 = 32,
[Description("Check G")]
Reason7 = 64
}
我需要指出失败原因的所有原因。使用" Reason1"等等......对于我正在寻找的东西来说,它的描述性不够。我需要一个更冗长的描述,例如" Reason1 - 检查A"。
例如:
值5是Reason1和Reason3。
然后描述如下:
失败:
原因1 - 检查A.
理由3 - 检查C.
是否可以组合描述如标志?
答案 0 :(得分:1)
这是我使用的一种更通用的扩展方法,它将处理包括枚举组合在内的所有枚举值:
public static string GetDescription(this Enum value)
{
//pull out each value in case of flag enumeration
var values = value.ToString().Split(',').Select(s => s.Trim());
var type = value.GetType();
return string.Join(" | ", values.Select(enumValue => type.GetMember(enumValue)
.FirstOrDefault()
?.GetCustomAttribute<DescriptionAttribute>()
?.Description
?? enumValue.ToString()));
}
如果不存在description属性,则它将仅返回值本身。
答案 1 :(得分:0)
为了产生您正在寻找的结果,请使用以下代码:
public static String GetDescription(ReasonCode reasonCode)
{
if (reasonCode == ReasonCode.None)
return "Verified";
StringBuilder sb = new StringBuilder();
sb.AppendLine("Failed:");
foreach (ReasonCode rc in Enum.GetValues(typeof(ReasonCode)).Cast<ReasonCode>())
{
if (rc == ReasonCode.None)
continue;
if (reasonCode.HasFlag(rc))
sb.AppendLine(rc.ToString() + " - " + GetEnumDescription(rc));
}
return sb.ToString();
}
用于检索描述值的代码基于this实现:
public static String GetEnumDescription(Enum value)
{
String valueText = value.ToString();
Type type = value.GetType();
FieldInfo fi = type.GetField(valueText);
Object[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
{
DescriptionAttribute attribute = (DescriptionAttribute)attributes[0];
return attribute.Description;
}
return valueText;
}
您可以找到有效的演示here。