Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
На заметку! На момент написания главы в хранилище GitHub для MSBuild шло активное обсуждение относительно добавления возможности поддержки нестроковых параметров, что позволило бы добавлять атрибут
CLSCompliant*.csУстановите несколько свойств (таких как
AuthorsDescriptionInternalsVisibleToAttribute<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> <Authors>Philip Japikse</Authors> <Company>Apress</Company> <Description>This is a simple car library with attributes</Description> </PropertyGroup> <ItemGroup> <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute"> <_Parameter1>CSharpCarClient</_Parameter1> </AssemblyAttribute> </ItemGroup></Project>После компиляции своего проекта перейдите в каталог
objDebugnet5.0AttributedCarLibrary.AssemblyInfo.csusing System;using System.Reflection;[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("CSharpCarClient")][assembly: System.Reflection.AssemblyCompanyAttribute("Philip Japikse")][assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")][assembly: System.Reflection.AssemblyDescriptionAttribute("This is asample 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Рефлексия атрибутов с использованием раннего связывания
Вспомните, что атрибуты остаются бесполезными до тех пор, пока к их значениям не будет применена рефлексия в другой части программного обеспечения. После обнаружения атрибута другая часть кода может предпринять необходимый образ действий. Подобно любому приложению "другая часть программного обеспечения" может обнаруживать присутствие специального атрибута с использованием либо раннего, либо позднего связывания. Для применения раннего связывания определение интересующего атрибута (в данном случае
VehicleDescriptionAttributeAttributedCarLibraryЧтобы проиллюстрировать процесс рефлексии специальных атрибутов, вставьте в решение новый проект консольного приложения по имени
VehicleDescriptionAttributeReaderAttributedCarLibrarydotnet new console -lang c# -n VehicleDescriptionAttributeReader -o .VehicleDescriptionAttributeReader -f net5.0dotnet sln .Chapter17_AllProjects.sln add .VehicleDescriptionAttributeReaderdotnet add VehicleDescriptionAttributeReader reference .AttributedCarLibraryПоместите в файл
Program.сsusing 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);