Доступ к пользовательским атрибутам уровня экземпляра в c # - PullRequest
2 голосов
/ 09 сентября 2011

Представьте, что у меня есть следующий код:

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

    ...
}


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

У меня вопрос: какой код нужно поместить в ????? , чтобы при вызове var1.WriteSomethingUseful я получал вывод foo , и когда я вызываю var2.WriteSomethingUseful , я получаю вывод bar ?

У меня такое ощущение, что это довольно простой вопрос, я думаю, что моя главная проблема в том, что я впал в смятение, слишком долго думая об этом !!!

Серьезно, я определил UsefulAttribute и понимаю, что часть кода должна быть GetCustomAttributes (typeof (UsefulAttribute) ...) вызов. Я запутался в том, как вытащить эти значения из реального экземпляра, а не на уровне типа.

Большое спасибо, Пит

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Это невозможно. Для начала, что если несколько разных экземпляров A имеют ссылки на один и тот же B? Или что, если на один и тот же экземпляр B ссылаются и var1, и var2?

Когда вы устанавливаете атрибут в поле, вы присоединяете этот атрибут к типу класса A, а не к экземпляру класса B, хранящемуся в поле var1.

Обычный способ сделать это - сохранить данные как свойство B, установить их либо через установщик свойств, либо с помощью параметра конструктора, а затем получить доступ к свойству из метода WriteSomethingUseful.

3 голосов
/ 09 сентября 2011

Поскольку ваш метод WriteSomethingUseful() относится к типу B, но ваши атрибуты объявлены в типе A, вы не сможете получить к ним доступ на основе экземпляра - у вас просто нет ссылки на A .

Текущий экземпляр B может вообще не быть связан с A и без возможности извлечь «тип экземпляра класса (если есть), который содержит текущий экземпляр B» - который не является возможно в C # - нет общего способа сделать это.

...