从实例化对象中访问自定义属性

时间:2015-06-09 20:33:52

标签: c# attributes

我试图找到一种方法来访问已在对象内属性级别应用的属性,但是我遇到了一堵砖墙。看来数据存储在类型级别,但我需要在属性级别。

以下是我尝试制作的一个例子:

public class MyClass
{
    [MyAttribute("This is the first")]
    MyField First;
    [MyAttribute("This is the second")]
    MyField Second;
}

public class MyField
{
    public string GetAttributeValue()
    {
        // Note that I do *not* know what property I'm in, but this
        // should return 'this is the first' or 'this is the second',
        // Depending on the instance of Myfield that we're in.
        return this.MyCustomAttribute.value;  
    }
}

1 个答案:

答案 0 :(得分:0)

属性不是那样使用的。属性存储在包含属性的类对象中,而不是在类中声明的成员对象/字段。

由于您希望每个成员都是唯一的,因此感觉更像是应该是MyField的成员数据,构造函数传入了这些内容。

如果您一直在使用属性,那么您可以在构造函数中添加代码,该代码在每个附加了属性的成员上使用反射,尝试将其实例数据设置为您想要的,但是需要确保所有MyField个对象都已完全构建。

或者你可以让你的二传手看起来像这样:

private MyField _first;
[MyAttribute("This is the first")]
public MyField First {
    get { return _first; }
    set {
        _first = value;
        if (_first != null) {
            _first.SomeAttribute = GetMyAttributeValue("First");
        }
    }
 }

 private string GetMyAttributeValue(string propName)
 {
     PropertyInfo pi = this.GetType().GetPropertyInfo(propName);
     if (pi == null) return null;
     Object[] attrs = pi.GetCustomAttributes(typeof(MyAttribute));
     MyAttribute attr =  attrs.Length > 0 ? attrs[0] as MyAttribute : null;
     return attr != null ? attr.Value : null;
 }