2016-02-09 81 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(); 

如果你想在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(); 

和所有拉姆達的解決方案:

 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

這個工程,你可以轉換它只使用lambda表達式?而不是所有from,select,where – Pachu

-1

關鍵字是反思:

你有沒有試過類似的東西?

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

這會導致'NullReferenceException',因爲您在'KodEnum'類型而不是其成員上調用'GetCustomAttributes'。 – 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 ; 
    } 
}