Я пробовал много раз, но все еще не могу понять использование настраиваемых атрибутов (я уже просмотрел много ссылок).
Может ли кто-нибудь объяснить мне очень простой пример настраиваемого атрибута с кодом?
источник
Я пробовал много раз, но все еще не могу понять использование настраиваемых атрибутов (я уже просмотрел много ссылок).
Может ли кто-нибудь объяснить мне очень простой пример настраиваемого атрибута с кодом?
Хотя код для создания настраиваемого атрибута довольно прост, очень важно понимать, что такое атрибуты:
Атрибуты - это метаданные, скомпилированные в вашу программу. Сами атрибуты не добавляют функциональности классу, свойству или модулю - только данные. Однако, используя отражение, можно использовать эти атрибуты для создания функциональности.
Так, например, давайте посмотрим на блок приложения проверки из корпоративной библиотеки Microsoft . Если вы посмотрите на пример кода, вы увидите:
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
Из приведенного выше фрагмента можно предположить, что код всегда будет проверяться при каждом изменении в соответствии с правилами валидатора (в этом примере должно быть не менее 8 символов и не более 8 символов). Но правда в том, что Атрибут ничего не делает; как упоминалось ранее, он только добавляет метаданные к свойству.
Однако в корпоративной библиотеке есть Validation.Validate
метод, который будет изучать ваш объект, и для каждого свойства он проверяет, не нарушает ли содержимое правило, указанное атрибутом.
Итак, вот как вы должны думать об атрибутах - способе добавления данных в ваш код, которые впоследствии могут быть использованы другими методами / классами / и т. Д.
Вы начинаете с написания класса, производного от Attribute :
Затем вы можете украсить что угодно (класс, метод, свойство, ...) этим атрибутом:
и, наконец, вы должны использовать отражение, чтобы получить его:
Вы можете ограничить целевые типы, к которым может применяться этот настраиваемый атрибут, с помощью атрибута AttributeUsage :
Что важно знать об атрибутах:
источник
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
Используя / копируя отличный ответ Дарина Димитрова , вот как получить доступ к настраиваемому атрибуту свойства, а не класса:
Декорированное имущество [класса
Foo
]:Получение:
Вы можете добавить это в цикл и использовать отражение для доступа к этому настраиваемому атрибуту для каждого свойства класса
Foo
:Большое спасибо тебе, Дарин !!
источник
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Я просто хочу перебрать их все и вызвать методm1()
каждого неизвестного атрибутаКороткий ответ - для создания атрибута в С # вам нужно только наследовать его от класса Attribute, только это :)
Но здесь я собираюсь подробно объяснить атрибуты:
в основном атрибуты - это классы, которые мы можем использовать для применения нашей логики к сборкам, классам, методам, свойствам, полям, ...
В .Net Microsoft предоставила некоторые предопределенные атрибуты, такие как устаревшие или атрибуты проверки, такие как ([Required], [StringLength (100)], [Range (0, 999,99)]), также у нас есть такие атрибуты, как ActionFilters в asp.net это может быть очень полезно для применения желаемой логики к нашим кодам (прочтите эту статью о фильтрах действий, если вы хотите ее изучить)
Еще один момент, вы можете применить некоторую конфигурацию к своему атрибуту через AttibuteUsage.
Когда вы украшаете класс атрибута с помощью AttributeUsage, вы можете указать компилятору C #, где я собираюсь использовать этот атрибут: я собираюсь использовать его в классах, в сборках, в свойствах или на ... и моему атрибуту разрешено использовать несколько раз по определенным целям (классы, сборки, свойства, ...) или нет ?!
После этого определения атрибутов я покажу вам пример: представьте, что мы хотим определить новый урок в университете, и мы хотим, чтобы только администраторы и мастера нашего университета могли определять новый урок, хорошо?
В реальном мире программирования, возможно, мы не используем этот подход для использования атрибутов, и я сказал это из-за его образовательного смысла в использовании атрибутов.
источник