Открытое и доступное только для чтения свойство может использоваться в качестве именованного параметра таким же образом, как и открытое поле. В качестве примера ниже показано, как автоматически реализуемое свойствоPriorityтипаintвводится в классRemarkAttribute.
// Использовать свойство в качестве именованного параметра атрибута.
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {
string pri_remark; // базовое поле свойства Remark
public string Supplement; // это именованный параметр
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 о 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, Туре, перечислением или одномерным массивом одного из этих типов.
Встроенные атрибуты