从标记的枚举中获取描述属性

Joh*_*tos 4 c# reflection enums system.componentmodel

我正在尝试创建一个扩展方法,它将返回一个仅List<string>包含Description给定的设置值的所有属性[Flags] Enum.

例如,假设我在C#代码中声明了以下枚举:

[Flags]
public enum Result
{
    [Description("Value 1 with spaces")]
    Value1 = 1,
    [Description("Value 2 with spaces")]
    Value2 = 2,
    [Description("Value 3 with spaces")]
    Value3 = 4,
    [Description("Value 4 with spaces")]
    Value4 = 8
}
Run Code Online (Sandbox Code Playgroud)

然后将变量设置为:

Result y = Result.Value1 | Result.Value2 | Result.Value4;
Run Code Online (Sandbox Code Playgroud)

所以,我想要创建的调用将是:

List<string> descriptions = y.GetDescriptions();
Run Code Online (Sandbox Code Playgroud)

最终结果将是:

descriptions = { "Value 1 with spaces", "Value 2 with spaces", "Value 4 with spaces" };
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个扩展方法,用于获取Enum 的单个描述属性,该属性不能设置多个标记,这些标记位于以下行中:

public static string GetDescription(this Enum value)
{
    Type type = value.GetType();
    string name = Enum.GetName(type, value);
    if (name != null)
    {
        System.Reflection.FieldInfo field = type.GetField(name);
        if (field != null)
        {
            DescriptionAttribute attr =
                   Attribute.GetCustomAttribute(field,
                     typeof(DescriptionAttribute)) as DescriptionAttribute;
            if (attr != null)
            {
                return attr.Description;
            }
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我在网上找到了一些关于如何获取给定枚举类型的所有描述属性的答案(例如此处),但是我在编写通用扩展方法时遇到问题,只返回设置属性的描述列表.

任何帮助将非常感激.

谢谢!!

bor*_*egg 8

HasFlag是你的朋友.:-)

下面的扩展方法使用您在上面发布的GetDescription扩展方法,因此请确保您拥有该方法.然后应该有以下工作:

public static List<string> GetDescriptionsAsText(this Enum yourEnum)
{       
    List<string> descriptions = new List<string>();

    foreach (Enum enumValue in Enum.GetValues(yourEnum.GetType()))
    {
        if (yourEnum.HasFlag(enumValue))
        {
            descriptions.Add(enumValue.GetDescription());
        }
    }

    return descriptions;
}
Run Code Online (Sandbox Code Playgroud)

注意:HasFlag允许您将给定的Enum值与定义的标志进行比较.在你的例子中,如果你有

Result y = Result.Value1 | Result.Value2 | Result.Value4;
Run Code Online (Sandbox Code Playgroud)

然后

y.HasFlag(Result.Value1)
Run Code Online (Sandbox Code Playgroud)

应该是真的,而

y.HasFlag(Result.Value3)
Run Code Online (Sandbox Code Playgroud)

将是假的.

另见:https://msdn.microsoft.com/en-us/library/system.enum.hasflag(v = vs.110).aspx