C#使用[标志]和[描述]

时间:2017-12-11 21:46:50

标签: c# enums

我希望结合使用枚举 - 按位[标志] - 以及使用结果组合的描述。我在这里使用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.

是否可以组合描述如标志?

2 个答案:

答案 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