2016-02-09 3 views
1

у меня есть это следующее перечисление:C# - Получение всех значений Перечисления атрибута

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 из «Задачи».

Как я мог это сделать?

+1

Почему бы не определить две перечислений? Один для вкладки или причины и один для действия или задачи. – juharr

+0

В этом случае вы правы, но это всего лишь маленький пример того, что у меня есть в моем проекте, где у меня есть 60 значений в этом перечислении, и в конкретном случае мне не нужны все они. – Pachu

ответ

4

Что-то, как это должно получить вас на пути ...

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(); 

Если вы хотите, значение целого типа, то просто брось:

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(); 

И все-лямбда решение:

 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(); 
+0

Это дает мне, что имена перечисления, я хочу значения, как 0,1,2 и такие – Pachu

+0

Это работает, можете ли вы преобразовать его, используя только лямбда-выражения? вместо всего, from, select, где – Pachu

-1

Ключевые слова Отражение:

Вы пробовали что-то вроде этого?

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

Это вызывает 'NullReferenceException', потому что вы вызываете' GetCustomAttributes' на тип 'KodEnum', а не на его члены. – juharr

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 ; 
    } 
} 
Смежные вопросы