代码之家  ›  专栏  ›  技术社区  ›  John Bustos

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

  •  8
  • John Bustos  · 技术社区  · 7 年前

    List<string> 包含所有 Description 仅用于给定 [Flags] Enum .

    [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
    }
    

    然后将变量设置为:

    Result y = Result.Value1 | Result.Value2 | Result.Value4;
    

    因此,我想要创建的调用是:

    List<string> descriptions = y.GetDescriptions();
    

    最终结果是:

    descriptions = { "Value 1 with spaces", "Value 2 with spaces", "Value 4 with spaces" };
    

    我创建了一个扩展方法来获取 单个描述属性 对于不能按以下行设置多个标志的枚举:

    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;
    }
    

    我在网上找到了一些关于如何获取给定枚举类型的所有描述属性的答案(例如 here 仅适用于集合属性 .

    任何帮助都将不胜感激。

    3 回复  |  直到 7 年前
        1
  •  11
  •   bornfromanegg    7 年前

    HasFlag

    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;
    }
    

    笔记 : HasFlag公司

    Result y = Result.Value1 | Result.Value2 | Result.Value4;
    

    然后

    y.HasFlag(Result.Value1)
    

    应该是真的

    y.HasFlag(Result.Value3)
    

    将是错误的。

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

        2
  •  3
  •   Kapé    6 年前

    这是一个使用LINQ的紧凑解决方案,它还检查 null

    public static List<T> GetFlagEnumAttributes<T>(this Enum flagEnum) where T : Attribute
    {
       var type = flagEnum.GetType();
       return Enum.GetValues(type)
          .Cast<Enum>()
          .Where(flagEnum.HasFlag)
          .Select(e => type.GetMember(e.ToString()).First())
          .Select(info => info.GetCustomAttribute<T>())
          .Where(attribute => attribute != null)
          .ToList();
    }
    
        3
  •  0
  •   George Alexandria    7 年前

        public static List<T> GetAttributesByFlags<T>(this Enum arg) where T: Attribute
        {
            var type = arg.GetType();
            var result = new List<T>();
            foreach (var item in Enum.GetValues(type))
            {
                var value = (Enum)item;
                if (arg.HasFlag(value)) // it means that '(arg & value) == value'
                {
                    var memInfo = type.GetMember(value.ToString())[0];
                    result.Add((T)memInfo.GetCustomAttribute(typeof(T), false));
                }
            }
            return result;
        }
    

    您可以获得所需的属性列表:

    var arg = Result.Value1 | Result.Value4;
    List<DescriptionAttribute> attributes = arg.GetAttributesByFlags<DescriptionAttribute>();