将属性属性作为实例属性访问 - 是否有可能?

问题描述:

例如,我有一个类的属性和属性:将属性属性作为实例属性访问 - 是否有可能?

[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

我不确定你想达到什么,但是下面的代码会让你知道如何在运行时从你的程序集中提取属性数据。请注意属性数据是每个类型声明,而不是每个类型的实例。

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