[assembly: System.Reflection.AssemblyCompanyAttribute("Philip Japikse")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("This is a
sample car library with
attributes")][assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("AttributedCarLibrary")]
[assembly: System.Reflection.AssemblyTitleAttribute("AttributedCarLibrary")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
И последнее замечание, касающееся атрибутов сборки: вы можете отключить генерацию файла AssemblyInfо.cs
Рефлексия атрибутов с использованием раннего связывания
Вспомните, что атрибуты остаются бесполезными до тех пор, пока к их значениям не будет применена рефлексия в другой части программного обеспечения. После обнаружения атрибута другая часть кода может предпринять необходимый образ действий. Подобно любому приложению "другая часть программного обеспечения" может обнаруживать присутствие специального атрибута с использованием либо раннего, либо позднего связывания. Для применения раннего связывания определение интересующего атрибута (в данном случае VehicleDescriptionAttribute
AttributedCarLibrary как открытый класс, раннее связывание будет наилучшим выбором.Чтобы проиллюстрировать процесс рефлексии специальных атрибутов, вставьте в решение новый проект консольного приложения по имени VehicleDescriptionAttributeReader
AttributedCarLibrary. Выполните приведенные далее команды CLI (каждая должна вводиться по отдельности):dotnet new console -lang c# -n VehicleDescriptionAttributeReader -o .\
VehicleDescriptionAttributeReader -f net5.0
dotnet sln .\Chapter17_AllProjects.sln add .\VehicleDescriptionAttributeReader
dotnet add VehicleDescriptionAttributeReader reference .\AttributedCarLibrary
Поместите в файл Program.сs
using System;
using AttributedCarLibrary;
Console.WriteLine("***** Value of VehicleDescriptionAttribute *****\n");
ReflectOnAttributesUsingEarlyBinding();
Console.ReadLine();
static void ReflectOnAttributesUsingEarlyBinding()
{
// Получить объект Type, представляющий тип Winnebago.
Type t = typeof(Winnebago);
// Получить все атрибуты Winnebago.
object[] customAtts = t.GetCustomAttributes(false);
// Вывести описание.
foreach (VehicleDescriptionAttribute v in customAtts)
{
Console.WriteLine("-> {0}\n", v.Description);
}
}
Метод Type.GetCustomAttributes()
Туре (булевский параметр управляет тем, должен ли поиск распространяться вверх по цепочке наследования). После получения списка атрибутов осуществляется проход по всем элементам VehicleDescriptionAttribute с отображением значения свойства Description.Рефлексия атрибутов с использованием позднего связывания