Поиск

Атрибуты однократного и многократного использования

AttributeUsage позволяет задать атрибуты для одно- и многократного применения. Это определит, как много раз один атрибут может быть задействован с одним полем. По умолчанию все атрибуты используются однократно. Это означает, что при компиляции следующего кода возникнет ошибка компилятора:

using System;
using System.Reflection;
public class SingleUseAttribute : Attribute {
public SingleUseAttribute(String str)
{
> }
// ОШИБКА: возникает ошибка компилятора "duplicate attribute".
[SingleUse("abc")]
[SingleUse("def")]
class MyClass
{
}
class SinglellseApp {
public static void Main()
{
} }

Чтобы исправить эту ошибку, укажите в строке Attribute Usage, что вы хотите разрешить многократное использование атрибута с данным типом. Этот код будет работать:

using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
public class SingleUseAttribute : Attribute
{
public SingleUseAttribute(String str)
{
}
>
[SingleUse("abc")]
[SingleUse("def")]
class MyClass
{
>
class MultiUseApp {
public static void Main()
{ } }

Практическим примером использования этого подхода служит атрибут RegistryKeyAttribute (см. раздел "Определение атрибутов"). Поскольку вполне реально, что поле может быть сохранено в нескольких местах реестра, можете прикрепить атрибут Attribute Usage с именованным параметром AllowMultiple, как показано в примере выше.

Задание правил наследования атрибутов

Последний параметр атрибута Attribute Usage — флаг inherited — определяет, может ли атрибут наследоваться. Его значение по умолчанию равно false. Если же установить флаг inherited в true, его значение зависит от значения флага AllowMultiple. Если inherited установлен в true, a Allow-Multiple — в false, установленный атрибут заменит унаследованный. Однако если и inherited, и AllowMultiple установлен в true, атрибуты члена будут аккумулироваться.