Может ли пользовательский атрибут запрашивать значение свойства, к которому он прикреплен? - PullRequest
2 голосов
/ 21 июня 2011

Пример:

[OnlyShowIfValueIsNonZero]
public int Foo { get; set; }

В коде для OnlyShowIfValueIsNonZero мне нужно иметь возможность запросить значение Foo. Это возможно? Если да, то как?

Ответы [ 3 ]

3 голосов
/ 21 июня 2011

Атрибут не знает о члене, которому он назначен, и для атрибута экземпляр будет создан, только если вы получите к нему доступ через отражение. Вы не можете позволить атрибуту взаимодействовать с кодом напрямую - есть некоторые фреймворки, такие как PostSharp, хотя они внедряют код во время компиляции с использованием атрибутов.

Однако вы можете из отражения предоставить элемент, которому он назначен, и, поскольку вам уже нужен элемент для доступа к его атрибутам, вы можете создать метод в этом атрибуте, который принимает элемент в качестве параметра.

1 голос
/ 21 июня 2011

Я думаю, вы начинаете погружаться в мир аспектно-ориентированного программирования здесь.Многие платформы AOP предоставляют точки расширения для определения ваших собственных пользовательских аспектов, что, я думаю, подойдет вам.

PostSharp - очень популярная среда AOP для .NET

0 голосов
/ 21 июня 2011

может быть, это так.и, например, T ваш класс ...

foreach (PropertyInfo propertyInfo in (typeof(T)).GetProperties()){
    foreach (object attribute in propertyInfo.GetCustomAttributes(true))
    {
        if ( attribute is OnlyShowIfValueIsNonZero )
        {
           ......
        }
    }
}
...