Подтвердить что ты не робот

С# - Использование пользовательских аннотаций?

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

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
}
4b9b3361

Ответ 1

Моя аннотация никогда не вызывает по каким-либо причинам каких-либо решений?

Это своего рода непонимание атрибутов. Атрибуты эффективно существуют, чтобы добавить метаданные к определенным частям вашего кода (классы, свойства, поля, методы, параметры и т.д.). Компилятор берет информацию в атрибуте и испекает ее в ИЛ, который он выплевывает, когда он есть, едя ваш источник код.

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

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

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

foreach(var attribute in attributes) {
    Console.WriteLine(attribute.ToString());
}