Модифицируйте определение VehicleDescriptionAttribute
[VehicleDescription] может применяться только к классу или структуре:// На этот раз для аннотирования специального атрибута
// используется атрибут AttributeUsage.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false)]
public sealed class VehicleDescriptionAttribute : System.Attribute
{
...
}
Теперь если разработчик попытается применить атрибут [VehicleDescription]
Атрибуты уровня сборки
Атрибуты можно также применять ко всем типам внутри отдельной сборки, используя дескриптор [assembly:]
AssemblyAttributes.cs (не AssemblyInfо.cs, т.к. он генерируется автоматически) и поместить в него атрибуты уровня сборки.На заметку!
Какая-либо формальная причина для использования отдельного файла отсутствует; это связано чисто с удобством поддержки вашего кода. Помещение атрибутов сборки в отдельный файл проясняет тот факт, что в вашем проекте используются атрибуты уровня сборки, и показывает, где они находятся.При добавлении в проект атрибутов уровня сборки или модуля имеет смысл придерживаться следующей рекомендуемой схемы для файла кода:
// Первыми перечислить операторы using.
using System;
// Теперь перечислить атрибуты уровня сборки или модуля.
// Обеспечить совместимость с CLS для всех открытых типов в данной сборке.
[assembly: CLSCompliant(true)]
Если теперь добавить фрагмент кода, выходящий за рамки спецификации CLS (вроде открытого элемента данных без знака), тогда компилятор выдаст предупреждение:
// Тип ulong не соответствует спецификации CLS.
public class Winnebago
{
public ulong notCompliant;
}
На заметку!
В .NET Core внесены два значительных изменения. Первое касается того, что файлAssemblyInfo.cs теперь генерируется автоматически из свойств проекта и настраивать его не рекомендуется. Второе (и связанное) изменение заключается в том, что многие из предшествующих атрибутов уровня сборки (Version, Company и т.д.) были заменены свойствами в файле проекта.Использование файла проекта для атрибутов сборки
Как было демонстрировалось в главе 16 с классом InternalsVisibleToAttribute
На заметку!
На момент написания главы в хранилище GitHub для MSBuild шло активное обсуждение относительно добавления возможности поддержки нестроковых параметров, что позволило бы добавлять атрибутCLSCompliant с использованием файла проекта вместо файла *.cs.Установите несколько свойств (таких как Authors
Description), щелкнув правой кнопкой мыши на имени проекта в окне Solution Explorer, выберите в контекстном меню пункт Properties (Свойства) и в открывшемся окне свойств перейдите на вкладку Package. Кроме того, добавьте InternalsVisibleToAttribute, как делалось в главе 16. Содержимое вашего файла проекта должно выглядеть примерно так, как представленное ниже:
<_Parameter1>CSharpCarClient
После компиляции своего проекта перейдите в каталог \obj\Debug\net5.0
AttributedCarLibrary.AssemblyInfo.cs. Открыв его, вы увидите установленные свойства в виде атрибутов (к сожалению, они не особо читабельны в таком формате):using System;
using System.Reflection;
[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute
("CSharpCarClient")]