2016-03-02 122 views
0

我必須拋出枚舉,但我希望它與possbile一樣通用。我如何用propertyType替換Cast<XX>()部件?沒有鑄造的Foreach枚舉值

foreach (var prop in MainType.GetProperties().Where(x => x.PropertyType.IsEnum)) 
{ 
    var x = new { name = prop.Name, values = new List<object>() }; 

    foreach (var v in Enum.GetValues(prop.PropertyType).Cast<XX>()) 
     x.values.Add(new { p = v.GetAttribute<DescriptionAttribute>().Description, 
          c = v.GetAttribute<DefaultValueAttribute>().Value }); 

    o.Add(x); 
} 


    public static TAttribute GetAttribute<TAttribute>(this Enum value) where TAttribute : Attribute 
    { 
     var type = value.GetType(); 
     var name = Enum.GetName(type, value); 
     return type.GetField(name) 
      .GetCustomAttributes(false) 
      .OfType<TAttribute>() 
      .SingleOrDefault(); 
    } 

public enum JobApplicationState : short 
{ 
    [Description("Active")] 
    [DefaultValue(typeof(string), "bg-primary text-highlight")] 
    Active = 1, 
    [Description("Passive")] 
    [DefaultValue(typeof(string), "bg-grey text-highlight")] 
    Passive = 2, 
    [Description("Rejected")] 
    [DefaultValue(typeof(string), "bg-danger text-highlight")] 
    Rejected = 3, 
    [Description("Accepted")] 
    [DefaultValue(typeof(string), "bg-success text-highlight")] 
    Accepted = 4 
} 

這工作!

foreach (MemberInfo m in prop.PropertyType.GetFields()) 
{ 
    if (m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault() != null && m.GetCustomAttributes(typeof(DefaultValueAttribute), true).FirstOrDefault() != null) 
     { 
      x.values.Add(
       new 
       { 
        p = ((DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault()).Description, 
        c = ((DefaultValueAttribute)m.GetCustomAttributes(typeof(DefaultValueAttribute), true).FirstOrDefault()).Value 
     }); 
    } 
} 
+1

我不明白。你不需要投下它的權利?我的意思是,它是一個會員,可以有屬性。 – atlaste

+1

爲什麼不使用底層數字基元類型? (例如。鑄造爲int) – PTwr

+0

我不需要enum類型來使用GetAttribute方法嗎? – Mert

回答

2

你應該認識到,枚舉只不過是一個圍繞整數值的命名包裝。我已經介紹了枚舉如何在這裏工作的一些細節:Cast int to enum in C#

這裏的問題是從枚舉中獲取屬性值。正如你可能想象的那樣,這個問題是關於從類型獲取屬性,而不是從獲得屬性(沒有這樣的事情)。儘管如此,如果調用類似於void Foo<T>(T myEnum)的方法,類型T將包含所有必需的信息,即使'現實生活中'myEnum的值作爲整數類型傳遞。

由此您也可以推斷出您實際上是在尋找的屬性T,因爲您正在尋找該類型的成員(例如枚舉)。同樣,所有的細節都在我的帖子中,如何枚舉的工作。因此答案:

foreach (MemberInfo m in prop.PropertyType.GetFields()) 
{ 
    // use m.GetAttribute(...) 
} 
+0

你太棒了! – Mert

1

爲什麼難道你不只是強制轉換爲Enum

foreach (var v in Enum.GetValues(prop.PropertyType).Cast<Enum>()) 

現在你可以打電話給你的擴展,方法返回的列表中的每個元素。

v.GetAttribute<MyType>()