public RemarkAttribute(string comment) {
pri_remark = comment;
Supplement = "Отсутствует";
Priority = 1;
}
public string Remark {
get {
return pri_remark;
}
}
// Использовать свойство в качестве именованного параметра,
public int Priority { get; set; }
}
[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 o 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 validOn)
где validOn обозначает один или несколько элементов, к которым может быть применен объявляемый атрибут, тогда как AttributeTargets— перечисление, в котором определяются приведенные ниже значения.
All
Assembly
Class
Constructor
Delegate
Enum
Event
Field
GenericParameter
Interface
Method
Module
Parameter
Property
ReturnValue
Struct
Два этих значения или более можно объединить с помощью логической операции ИЛИ. Например, для указания атрибута, применяемого только к полям и свойствам, используются следующие значения.
AttributeTargets.Field I AttributeTargets.Property
В классе атрибута AttributeUsageподдерживаются два именованных параметра. Первым из них является параметр AllowMultiple, принимающий логическое значение. Если это значение истинно, то атрибут может быть применен к одному и тому же элементу неоднократно. Второй именованный параметр, Inherited, также принимает логическое значение. Если это значение истинно, то атрибут наследуется производными классами, а иначе он не наследуется. По умолчанию параметр AllowMultipleпринимает ложное значение ( false), а параметр Inherited — истинное значение ( true).
Читать дальше