枚举对字符串的描述

Mig*_*ura 8 c# enums

我有以下ENUM:

[Flags]
public enum DataFiat {

  [Description("Público")]
  Public = 1,

  [Description("Filiado")]
  Listed = 2,

  [Description("Cliente")]
  Client = 4

} // DataFiat
Run Code Online (Sandbox Code Playgroud)

我创建了一个扩展来获取Enum属性:

public static T GetAttribute<T>(this Enum value) where T : Attribute {

  T attribute;
  MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
  if (info != null) {
    attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
    return attribute;
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

这适用于非Flags Enums ...但是当我有:

var x = DataFiat.Public | DataFiat.Listed;
var y = x.GetAttribute<Description>();
Run Code Online (Sandbox Code Playgroud)

y的值为null ...

我想得到"Público,Filiado,Cliente"......就像ToString()一样.

如何更改我的扩展程序才能使其正常工作?

谢谢

Pat*_*man 2

你可以使用这个

var values = x.ToString()
             .Split(new[] { ", " }, StringSplitOptions.None)
             .Select(v => (DataFiat)Enum.Parse(typeof(DataFiat), v));
Run Code Online (Sandbox Code Playgroud)

从而获得个体的价值。然后获取它们的属性值。

像这样的东西:

var y2 = values.GetAttributes<DescriptionAttribute, DataFiat>();

public static T[] GetAttributes<T, T2>(this IEnumerable<T2> values) where T : Attribute
{
    List<T> ts =new List<T>();

    foreach (T2 value in values)
    {
        T attribute;
        MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
        if (info != null)
        {
            attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
            ts.Add(attribute);
        }
    }

    return ts.ToArray();
}
Run Code Online (Sandbox Code Playgroud)