获取枚举的属性

时间:2014-02-20 14:21:10

标签: c#

我有两个枚举,一个带有标志,另一个没有:

[Flags]
public enum MyEnumWithFlags {
  [Description("Item 1")] 
  Item1 = 1,
  [Description("Item 2")] 
  Item2 = 2,
  [Description("Item 3")] 
  Item3 = 4,
}

public enum MyEnum {
  [Description("Item 1")] 
  Item1,
  [Description("Item 2")] 
  Item2,
  [Description("Item 3")] 
  Item3,
}

获取我尝试过的属性:

  var a = MyEnumWithFlags.Item1 | MyEnumWithFlags.Item3;

  var b = a.GetAttributes<DescriptionAttribute>();

这很好用。变量b必须属性:“第1项”和“第2项”。

然后我尝试了没有旗帜的Myenum:

  var c = MyEnum.Item1;

  var d = c.GetAttributes<DescriptionAttribute>();

在这种情况下,变量d具有所有枚举属性。不仅是Item1。

有谁知道可能出错了什么? GetAttributes扩展名为:

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

  List<T> attributes = new List<T>();

  IEnumerable<Enum> flags = Enum.GetValues(value.GetType()).Cast<Enum>().Where(value.HasFlag);

  if (flags != null) {

    foreach (Enum flag in flags) {

      MemberInfo info = flag.GetType().GetMember(flag.ToString()).FirstOrDefault();

      if (info != null)
        attributes.Add((T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault());

    }

    return attributes;

  }
  return null;

} 

更新

通过检查枚举是否为类型标志,我最终得到以下内容:

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

  Type type = value.GetType();

  if (type.GetCustomAttributes<FlagsAttribute>().Any()) {

    List<T> attributes = new List<T>();

    IEnumerable<Enum> flags = Enum.GetValues(type).Cast<Enum>().Where(value.HasFlag);

    if (flags != null) {

      foreach (Enum flag in flags) {
        MemberInfo info = flag.GetType().GetMember(flag.ToString()).FirstOrDefault();
        if (info != null)
          attributes.Add((T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault());
      }

      return attributes;

    }

  } else {

    MemberInfo info = type.GetMember(value.ToString()).FirstOrDefault();

    if (info != null)
      return new List<T> { (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault() };

  }

  return null;

} // GetAttributes  

现在似乎可以使用Flags Enums和No Flags Enums。

有人认为这段代码可以改进吗?

谢谢

0 个答案:

没有答案
相关问题