И последнее замечание, касающееся атрибутов сборки: вы можете отключить генерацию файла
AssemblyInfо.cs
, если хотите управлять процессом самостоятельно.
Рефлексия атрибутов с использованием раннего связывания
Вспомните, что атрибуты остаются бесполезными до тех пор, пока к их значениям не будет применена рефлексия в другой части программного обеспечения. После обнаружения атрибута другая часть кода может предпринять необходимый образ действий. Подобно любому приложению "другая часть программного обеспечения" может обнаруживать присутствие специального атрибута с использованием либо раннего, либо позднего связывания. Для применения раннего связывания определение интересующего атрибута (в данном случае
VehicleDescriptionAttribute
) должно находиться в клиентском приложении на этапе компиляции. Учитывая то, что специальный атрибут определен в сборке
AttributedCarLibrary
как открытый класс, раннее связывание будет наилучшим выбором.
Чтобы проиллюстрировать процесс рефлексии специальных атрибутов, вставьте в решение новый проект консольного приложения по имени
VehicleDescriptionAttributeReader
. Добавьте в него ссылку на проект
AttributedCarLibrary
. Выполните приведенные далее команды CLI (каждая должна вводиться по отдельности):
dotnet new console -lang c# -n VehicleDescriptionAttributeReader -o .\
foreach (VehicleDescriptionAttribute v in customAtts)
{
Console.WriteLine("-> {0}\n", v.Description);
}
}
Метод
Type.GetCustomAttributes
возвращает массив объектов со всеми атрибутами, примененными к члену, который представлен объектом
Туре
(булевский параметр управляет тем, должен ли поиск распространяться вверх по цепочке наследования). После получения списка атрибутов осуществляется проход по всем элементам
VehicleDescriptionAttribute
с отображением значения свойства
Description
.
Рефлексия атрибутов с использованием позднего связывания
В предыдущем примере для вывода описания транспортного средства типа Winnebago применялось ранее связывание. Это было возможно благодаря тому, что тип класса
VehicleDescriptionAttribute
определен в сборке
AttributedCarLibrary
как открытый член. Для рефлексии атрибутов также допускается использовать динамическую загрузку и позднее связывание.
Добавьте к решению новый проект консольного приложения по имени
VehicleDescriptionAttributeReaderLateBinding
, установите его в качестве стартового и скопируйте сборку
AttributedCarLibrary.dll
в каталог проекта (или в
\bin\Debug\net5.0
, если вы работаете в Visual Studio). Модифицируйте файл
Program.cs
, как показано ниже:
using System;
using System.Reflection;
Console.WriteLine("***** Value of VehicleDescriptionAttribute *****\n");