Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю


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