Я думаю, что ответ на следующий вопрос даст вам некоторое представление о ваших вопросах.
Как работают классы атрибутов?
Вот репостответ, который я предоставил.
Атрибуты - это, по сути, метаданные, которые можно прикрепить к различным частям вашего кода.Эти метаданные могут затем объединяться и влиять на поведение определенных операций.
Атрибуты могут применяться практически ко всем аспектам вашего кода.Например, атрибуты могут быть связаны на уровне сборки, например атрибуты AssemblyVersion и AssemblyFileVersion, которые управляют номерами версий, связанных со сборкой.
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Тогда атрибут Serializable, например, можно применить к типуобъявление, чтобы пометить тип как поддерживающий сериализацию.На самом деле этот атрибут имеет особое значение в CLR и фактически хранится как специальная директива непосредственно для типа в IL, он оптимизирован для хранения в виде битового флага, который может быть обработан намного эффективнее, есть несколько атрибутов наэто природа, которая известна как псевдо пользовательские атрибуты.
Еще другие атрибуты могут применяться к методам, свойствам, полям, перечислениям, возвращаемым значениям и т. Д. Вы можете получить представление о возможных целях, к которым можно применить атрибут, перейдя по этой ссылке http://msdn.microsoft.com/en-us/library/system.attributetargets(VS.90).aspx
Кроме того, вы можете определить свои собственные пользовательские атрибуты, которые затем могут быть применены к соответствующим целям, для которых предназначены ваши атрибуты.Тогда во время выполнения ваш код может отражать значения, содержащиеся в пользовательских атрибутах, и предпринимать соответствующие действия.
Для довольно наивного примера, и это только для примера :) Возможно, вы захотите написать постоянстводвижок, который автоматически отобразит классы на таблицы в вашей базе данных и отобразит свойства класса на столбцы таблицы.Вы могли бы начать с определения двух пользовательских атрибутов
TableMappingAttribute
ColumnMappingAttribute
, которые затем можно применить к своим классам, например, у нас есть класс Person
[TableMapping("People")]
public class Person
{
[ColumnMapping("fname")]
public string FirstName {get; set;}
[ColumnMapping("lname")]
public string LastName {get; set;}
}
Когда это компилируется, крометот факт, что компилятор испускает дополнительные метаданные, определяемые пользовательскими атрибутами, мало что меняет.Однако теперь вы можете написать PersistanceManager, который может динамически проверять атрибуты экземпляра класса Person и вставлять данные в таблицу People, сопоставляя данные в свойстве FirstName со столбцом fname, а свойство LastName со столбцом lname.
Что касается вашего вопроса, касающегося экземпляров атрибутов, экземпляр атрибута создается не для каждого экземпляра вашего класса.Все экземпляры People будут совместно использовать один и тот же экземпляр TableMappingAttribute и ColumnMappingAttributes.Фактически, экземпляры атрибутов создаются только при первом запросе атрибутов.