Атрибуты в C#

Добавлен , опубликован
Раздел:
C#
Атрибутами в C# являются классы, содержащие в себе некоторую метаинформацию, встраиваемую в сборку приложения.
Атрибуты могут применяться ко всем типам в C#, включая даже другие атрибуты, поля, методы, свойства и перечисления. Основу атрибутов составляет класс System.Attribute, от которого все предполагаемые классы атрибутов должны наследоваться.
Нестандартные атрибуты позволяют определять информацию практически для любых элементов таблиц метаданных. Эту расширяемую метаинформацию можно получить во время выполнения для динамического изменения хода работы программы. Такие различные технологии .NET Framework как Windows Forms, Web Forms, Web-сервисы XML и тд применяют нестандартные атрибуты, позволяя разработчикам легко и даже иногда эффективно реализовывать в коде (но без кодирования) свои замыслы.
Библиотека классов .NET Framework (FCL) включает определения сотен нестандартных атрибутов, которые вы вправе задействовать в своем коде.
Вот несколько примеров:
  • Применение атрибута DllImport к методу говорит CLR, что метод реализован в виде неуправляемого кода, размещенного в указанной DLL-библиотеке.
  • Встречающееся достаточно часто в области геймдева, применение атрибута Serializable к типу информирует форматировщики сериализации, что поля экземпляра могут сериализоваться и десериализоваться.
  • Применение атрибута AssemblyVersion к сборке служит для задания номера версии этой сборки.
  • Применение атрибута Flags к перечислимому типу приводит к тому, что этот тип ведет себя, как набор битовых флагов.
Применение аттрибута выглядит следующим образом:
[Serializable] // самый сокращенный способ
public class Storage
{
}

// идентично примеру выше, но с визуализацией конструктора без параметров
[Serializable()]
public class Storage
{
}

// то же самое, но с добавлением постфикса Attribute
[SerializableAttribute]
public class Storage
{
}

// а теперь вместе все вышеперечисленное 
[SerializableAttribute()]
public class Storage
{
}
Во всех примерах выше рассматривался случай применения атрибута Serializable к классу Storage
Если необходимо применить все таки параметры, то используется оно так:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class Storage
{
}
Приведенные далее строки имеют одинаковый эффект и демонстрируют все возможные способы применения нескольких атрибутов:
[Serializable]
[Flags]
class Storage{}

[Serializable][Flags]
class Storage{}

[Serializable, Flags]
class Storage{}

[FlagsAttribute, SerializableAttribute]
class Storage{}

[FlagsAttribute()][Serializable()]
class Storage{}
Как видите, достаточно гибкий способ задания атрибутов, который может быть использован индивидуально каждым девелопером.

Создание собственных атрибутов

Синтаксис построения атрибута аналогичен синтаксису построения стандартного класса:
public class ExampleAttribute : System.Attribute
{
    public string Test { get; set; }
 
    public ExampleAttribute(string test)
    { 
        Test = test;
    }
 
    public ExampleAttribute()
    {
        Test = null;
    }
} 
Применение:
[Example("Hello, XGM!")]
class Storage{}
Выявление атрибута у класса будет таким:
[Example("Hello, XGM!")]
class Storage{}

....

Storage st = new Storage();
var storageAttribute =  st.GetType().GetCustomAttribute(typeof(Storage).Assembly, typeof(Example))
Console.WriteLine(storageAttribute.Test); // Hello, XGM!
За сим все. Спасибо за внимание.
`
ОЖИДАНИЕ РЕКЛАМЫ...