Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 329
- Предыдущая
- 329/642
- Следующая


В идеальном случае к настоящему моменту вы уже должны понимать перечисленные ниже ключевые моменты, касающиеся атрибутов .NET Core:
• атрибуты представляют собой классы, производные от
System.Attribute• атрибуты дают в результате встроенные метаданные;
• атрибуты в основном бесполезны до тех пор, пока другой агент не проведет в их отношении рефлексию;
• атрибуты в языке C# применяются с использованием квадратных скобок.
А теперь давайте посмотрим, как реализовывать собственные специальные атрибуты и создавать специальное программное обеспечение, которое выполняет рефлексию по встроенным метаданным.
Построение специальных атрибутов
Первый шаг при построении специального атрибута предусматривает создание нового класса, производного от
System.AttributeAttributedCarLibraryVehicleDescriptionAttributeusing System;// Специальный атрибут.public sealed class VehicleDescriptionAttribute :Attribute{ public string Description { get; set; } public VehicleDescriptionAttribute(string description) => Description = description; public VehicleDescriptionAttribute(){ }}Как видите, класс
VehicleDescriptionAttributeDescriptionSystem.AttributeНа заметку! По причинам, связанным с безопасностью, установившейся практикой в .NET Core считается проектирование всех специальных атрибутов как запечатанных. На самом деле среды Visual Studio и Visual Studio Code предлагают фрагмент кода под названием
AttributeSystem.AttributeПрименение специальных атрибутов
С учетом того, что класс
VehicleDescriptionAttributeSystem.Attribute// Motorcycle.csnamespace AttributedCarLibrary{ // Назначить описание с помощью "именованного свойства". [Serializable] [VehicleDescription(Description = "My rocking Harley")] // Мой покачивающийся Харли public class Motorcycle { }// HorseAndBuggy.csnamespace AttributedCarLibrary{ [Serializable] [Obsolete ("Use another vehicle!")] [VehicleDescription("The old gray mare, she ain't what she used to be...")] // Старая серая лошадка, она уже не та... public class HorseAndBuggy { }}// Winnebago.csnamespace AttributedCarLibrary{ [VehicleDescription("A very long, slow, but feature-rich auto")] // Очень длинный, медленный, но обладающий высокими // техническими характеристиками автомобиль public class Winnebago { }}Синтаксис именованных свойств
Обратите внимание, что классу
Motorcycle[VehicleDescription]DescriptionDescriptionПо контрасту для типов
HorseAndBuggyWinnebagoAttributedCarLibraryildasm.exeWinnebago// CustomAttribute #1// -------------------------------------------------------- Предыдущая
- 329/642
- Следующая
