2013-02-10 150 views
0

例如,我有一個類的屬性和屬性:將屬性屬性作爲實例屬性訪問 - 是否有可能?

[MyDisplay(Name = "Class name", Description = "Class description.")] 
public class MyClass 
{ 
    [MyDisplay(Name = "Property name", Description = "Property description.")] 
    public int MyProperty { get; set; } 
} 

我想得到這樣

// Get type attribute... 
string className = MyClass.Attributes.MyDisplay.Name; 

// Get member attribute... 
string propertyDescription = 
    MyClass.Properties.MyProperty.Attributes.MyDisplay.Description; 

如何獲得它的屬性值?我想要自動使用屬性數據填充MyClass的其他字段的代碼。這似乎是非常方便的訪問屬性值,如實例值 - 綁定等。

主要的複雜性是填充MyClass.Attributes和MyClass.Properties集合的名稱與屬性相同的對象和屬性名稱。所以我認爲這個集合必須是靜態的。並且MyClass.Properties集合中的每個對象也必須具有Attributes集合(例如MyProperty.Attributes),如MyClass.Attributes集合。

+0

你是什麼意思的'實例級屬性'?你想如何在你的代碼中聲明? – SergeyS 2013-02-10 12:19:45

+0

屬性「顯示」在MyClass上無效。它只對'方法,屬性,索引器,字段,參數'聲明有效。或者你是否實現了自己的Display屬性? – rene 2013-02-10 12:30:08

+0

rene,它可以是一個類的任何有效屬性。爲了清楚起見,我改了名字。 – user808128 2013-02-10 13:13:23

回答

0

我不確定你想達到什麼,但是下面的代碼會讓你知道如何在運行時從你的程序集中提取屬性數據。請注意屬性數據是每個類型聲明,而不是每個類型的實例。

foreach (var type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()) 
    { 
     // class attributes 
     foreach (var typeAttr in type.GetCustomAttributes(typeof(DisplayAttribute), false)) 
     { 
      Console.WriteLine(((DisplayAttribute)typeAttr).Name); 
      Console.WriteLine(((DisplayAttribute)typeAttr).Description); 
     } 

     // members attributes 
     foreach (var props in type.GetProperties()) 
     { 
      foreach (var propsAttr in props.GetCustomAttributes(typeof(DisplayAttribute), false)) 
      { 
       Console.WriteLine(((DisplayAttribute)propsAttr).Name); 
       Console.WriteLine(((DisplayAttribute)propsAttr).Description); 
      } 
     } 
    } 
+0

哦,我誤以爲了!所以,我知道如何獲取屬性及其屬性。我只是想把它們組織成類型的字段。爲了清晰起見,我修復了我的問題。 – user808128 2013-02-10 13:04:44