在c#中访问实例级自定义属性

时间:2011-09-09 14:41:25

标签: c# .net reflection custom-attributes

想象一下,我有以下代码:

class A
{
    [UsefulAttribute("foo")]
    B var1;
    [UsefulAttribute("bar")]
    B var2;

    ...
}


class B
{
    public string WriteSomethingUseful()
    {
        ?????
    }
}  

我的问题是,它需要在 ????? 中输入什么代码,这样当我调用 var1.WriteSomethingUseful 时,我得到的输出< strong> foo ,当我调用 var2.WriteSomethingUseful 时,我得到 bar 的输出?

我觉得这是一个非常直截了当的问题,我认为我的主要问题是我长时间以来一直在努力陷入混乱状态!

说真的,我定义了 UsefulAttribute 并意识到部分代码必须是 GetCustomAttributes(typeof(UsefulAttribute)...)调用。我感到困惑的是如何将这些值拉出实际实例,而不是类型级别。

非常感谢, 皮特

2 个答案:

答案 0 :(得分:5)

这是不可能的。对于初学者来说,如果A的多个不同实例引用了同一个B,该怎么办?或者如果var1和var2都引用了相同的B实例,那该怎么办?

在字段上设置属性时,您将该属性附加到类A的类型,而不是存储在字段var1中的类B的实例。

通常的做法是将数据存储为B的属性,通过属性设置器或构造函数参数设置它,然后从WriteSomethingUseful方法访问该属性。

答案 1 :(得分:3)

由于您的WriteSomethingUseful()方法属于B类,但您的属性是在A类型中声明的,因此您将无法根据实例访问它们 - 您根本就没有参考到A

当前B实例可能根本与A无关,并且无法检索“包含当前B的类实例的类型(如果有)实例“ - 这在C#中是不可能的 - 没有通用的方法来做到这一点。