2014-07-07 46 views
0

我有一個單獨的類,我想獲得的「描述」屬性:不知道如果我得到Description屬性正確

public class Fruits 
{ 
    [Description("The green apples are very green.")] 
    public const string Apples= "Green"; 

    [Description("Sunkist oranges are very sweet.")] 
    public const string Oranges= "Sunkist"; 

    [Description("Red grapes are make for wine.")] 
    public const string Grapes= "Red"; 
} 

爲了討論各種情形,我有我想要一個單獨的類檢索說明。 這樣的代碼塊的樣子:

 Type fruitType = typeof(LotsOfFruits.Fruits); 

     FieldInfo[] fields = fruitType.GetFields(); 

     foreach (var field in fields) 
     { 
      Console.WriteLine("Name: {0}", field.Name); 
      Console.WriteLine("Value: {0}", field.GetRawConstantValue().ToString()); 
      List<System.Attribute> attr = field.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute)).ToList(); 
     } 

的名稱和值都正常拉。 我很難得到Description屬性。 在這一點上,我想知道如果這是正確的方式(即把它放入一個列表)。

任何意見或建議,以獲得描述屬性?

+0

我沒有看到任何你的代碼錯誤。我可以填充attr值就好了。 –

回答

1

它適用於我,但您需要將DescriptionAttribute作爲基礎Attribute類進行投射。此外,我傾向於獲得第一或默認,除非我知道我可能有多個。

class Program 
{ 

    static void Main(string[] args) 
    { 
     Type fruitType = typeof(Fruits); 

     FieldInfo[] fields = fruitType.GetFields(); 

     foreach (var field in fields) 
     { 
      Console.WriteLine("Name: {0}", field.Name); 
      Console.WriteLine("Value: {0}", field.GetRawConstantValue().ToString()); 
      var attr = field.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute)).Cast < System.ComponentModel.DescriptionAttribute>().FirstOrDefault(); 
      Console.WriteLine("Description: {0}", attr.Description); 
      Console.ReadLine(); 
     } 
    } 
} 

public class Fruits 
{ 
    [Description("The green apples are very green.")] 
    public const string Apples= "Green"; 

    [Description("Sunkist oranges are very sweet.")] 
    public const string Oranges= "Sunkist"; 

    [Description("Red grapes are make for wine.")] 
    public const string Grapes= "Red"; 
} 
+0

非常感謝! 我需要施放它。啊。我不知道我在想什麼。 我希望我能感謝你們所有人的建議,因爲他們都有道理。 –

2

我不知道你的背景,而是由閱讀你的代碼似乎你會繼承一個類水果與名稱和描述性的更好:

比你的代碼似乎是正確
public abstract class Fruit 
{ 
    public abstract string Name { get; } 
    public abstract string Description { get; } 
} 

public class Apple : Fruit 
{ 
    public string Name { get { return "Apple"; } 
    public string Description { get { return "The green apples are very green."; } 
} 

public class Orange : Fruit 
{ 
    public string Name { get { return "Orange"; } 
    public string Description { get { return "Sunkist oranges are very sweet."; } 
} 

其他。

2

你有什麼好;所有你需要的是:

var attr = (DescriptionAttribute)field.GetCustomAttribute(
    typeof(DescriptionAttribute)); 
if(attr != null) Console.WriteLine("Desc: {0}", attr.Description); 

或者在以後的版本.NET:

var attr = field.GetCustomAttribute<DescriptionAttribute>(); 
if(attr != null) Console.WriteLine("Desc: {0}", attr.Description); 
+0

就我所見,這個擴展方法的兩個重載都是.Net 4.5中的新增功能。 – svick

相關問題