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

本文关键字:访问 自定义属性 对象 实例化 | 更新日期: 2023-09-27 17:54:38

我正试图找到一种方法来访问从对象内的属性级别应用的属性,但我遇到了瓶颈。数据似乎存储在类型级别,但我需要它存储在属性级别。

下面是我想做的一个例子:

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;  
    }
}

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

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

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

如果你执意要使用一个属性,你可以在你的构造函数中添加代码,对每个有属性的成员使用反射,并尝试将其实例数据设置为你想要的,但是你需要确保所有的MyField对象都是完全构造的。

或者你可以让setter看起来像这样:

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;
 }