}
[RemarkAttribute('В этом классе используется атрибут.',
Supplement = ' Это дополнительная информация.',
Priority = 10)] class UseAttrib {
// ...
}
class NamedParamDemo { static void Main() {
Type t = typeof(UseAttrib);
Console.Write('Атрибуты в классе ' + t.Name + ': ');
object[] attribs = t.GetCustomAttributes(false); foreach(object о in attribs) {
Console.WriteLine(o);
// Извлечь атрибут RemarkAttribute.
Type tRemAtt = typeof(RemarkAttribute);
RemarkAttribute ra = (RemarkAttribute)
Attribute.GetCustomAttribute(t, tRemAtt);
Console.Write('Примечание: ') ;
Console.WriteLine(ra.Remark);
Console.Write('Дополнение: ') ;
Console.WriteLine(ra.Supplement);
Console.WriteLine('Приоритет: ' + ra.Priority);
}
}
Вот к какому результату приводит выполнение этого кода.
Атрибуты в классе UseAttrib: RemarkAttribute Примечание: В этом классе используется атрибут.
Дополнение: Это дополнительная информация.
Приоритет: 10
В данном примере обращает на себя внимание порядок указания атрибутов перед классом UseAttrib, как показано ниже.
[RemarkAttribute('В этом классе используется атрибут.',
Supplement = ' Это дополнительная информация.',
Priority = 10)] class UseAttrib {
// ...
}
Именованные параметры атрибутов Supplement и Priority
И последнее замечание: тип параметра атрибута (как позиционного, так и именованного) должен быть одним из встроенных простых типов, object, Туре, перечислением или одномерным массивом одного из этих типов.
Встроенные атрибуты
В C# предусмотрено несколько встроенных атрибутов, но три из них имеют особое значение, поскольку они применяются в самых разных ситуациях. Это атрибуты AttributeUsage, Conditional и Obsolete, рассматриваемые далее по порядку.
Атрибут AttributeUsage
Как упоминалось ранее, атрибут AttributeUsage определяет типы элементов, к которым может быть применен объявляемый атрибут. AttributeUsage — это, по существу, еще одно наименование класса System. AttributeUsageAttribute. У него имеется следующий конструктор:
AttributeUsage(AttributeTargets
где
АН
Assembly
Class
