C # - Использование пользовательских аннотаций? - PullRequest
12 голосов
/ 25 июля 2011

Я создал этот класс аннотаций
Этот пример может не иметь смысла, потому что он всегда выдает исключение, но я все еще использую его, так как я просто пытаюсь объяснить, что мой вопрос.Моя аннотация никогда не вызывается по каким-либо причинам какие-либо решения?

public class AuthenticationRequired : System.Attribute
{
   public AuthenticationRequired()
   {
      // My break point never gets hit why?
      throw new Exception("Throw this to see if annotation works or not");
   }
}

[AuthenticationRequired]
private void Window_Loaded(object sender, RoutedEventArgs e)
{
   // My break point get here
}

1 Ответ

24 голосов
/ 25 июля 2011

По каким-либо причинам моя аннотация никогда не вызывается, какие-либо решения?

Это своего рода недопонимание атрибутов. Фактически существуют атрибуты для добавления метаданных к определенным частям вашего кода (классам, свойствам, полям, методам, параметрам и т. Д.). Компилятор берет информацию из атрибута и заполняет ее в IL, который он выплевывает, когда закончил есть ваш источник код.

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

Чтобы получить атрибуты во время выполнения, вы должны сказать что-то вроде

var attributes = typeof(Foo)
                    .GetMethod("Window_Loaded")
                    .GetCustomAttributes(typeof(AuthenticationRequired), true)
                    .Cast<AuthenticationRequired>();

foreach(var attribute in attributes) {
    Console.WriteLine(attribute.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...