C# - 按属性获取所有枚举值

时间:2016-02-09 14:27:07

标签: c# enums attributes

我有以下枚举:

public enum KodEnum
{
    [EnumType(EnumType = "Task")]
    TaskTab,
    [EnumType(EnumType = "Task")]
    TaskReason,
    [EnumType(EnumType = "Action")]
    ActionTab,
    [EnumType(EnumType = "Action")]
    ActionReason
}

public class EnumTypeAttribute : Attribute
{
    public string EnumType { get; set; }
}

我希望获得EnumType为“Task”的所有枚举列表。

我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

这样的事情会让你顺利...

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select member.GetValue(null))
                 .Cast<KodEnum>()
                 .ToList();

如果你想要int值,那么只需投射它:

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select (int)member.GetValue(null))
                 .ToList();

并且所有lambda解决方案:

        var enumValues = typeof(KodEnum)
            .GetFields()
            .Select(x => new 
                { 
                    att = x.GetCustomAttributes(false)
                             .OfType<EnumTypeAttribute>()
                             .FirstOrDefault(), 
                    member = x 
                })
            .Where(x => x.att != null && x.att.EnumType == "Task")
            .Select(x => (int)x.member.GetValue(null))
            .ToList();

答案 1 :(得分:0)

你可以这样做:

var result = Enum.GetValues(typeof(KodEnum)).OfType<KodEnum>()  
                 .Where(x=>x.EnumType() == "Task");

这是EnumType扩展方法实现:

public static class EnumExtensions
{
   public static string EnumType(this Enum value)  
   {  
       FieldInfo field = value.GetType().GetField(value.ToString());  

       EnumTypeAttribute attribute  
               = Attribute.GetCustomAttribute(field, typeof(EnumTypeAttribute ))  
                   as EnumTypeAttribute;  

       return attribute == null ? value.ToString() : attribute.EnumType ;  
   }  
}  

答案 2 :(得分:-1)

关键字是反思:

你尝试过这样的事吗?

Enum.GetValues(typeof(KodEnum))
    .OfType<KodEnum>()
    .Where(o => o.GetType()
        .GetCustomAttributes(typeof(EnumTypeAttribute), false)
        .OfType<EnumTypeAttribute>()
        .FirstOrDefault()
        .EnumType == "Task");