2010-07-07 2 views
15

Я действительно мало знаю об атрибутах в целом на C#, я видел их в использовании разными способами/местами, но я не думаю, что вижу важность некоторых из их. Некоторые определенно имеют важное значение, поскольку они обеспечивают заметную функцию, например, [Serializable]. Тем не менее, другие не кажутся такими важными, как, например, один мой сотрудник использует для обозначения свойств с помощью [DataMember].C# Атрибуты и их использование

Я полагаю, что мой вопрос в том, какие атрибуты и как они полезны? Есть ли способ создать мои собственные атрибуты и как я могу определить, установлены ли в этих атрибутах поля/методы/классы/независимо от определенных атрибутов или какие значения установлены?

+0

FYI, '[DataMember]' используется для сериализации данных: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx –

ответ

20

какие атрибуты?

Атрибуты позволяют встраивать информацию о типе или методе в метаданные, описывающие этот тип или метод.

You typically want to use attributes to describe facts about the mechanism of the type or method rather than the meaning of the type or method. Например, предположим, что у вас есть тип Employee. Факт об , означающий Employee, заключается в том, что это своего рода Лицо, у которого есть Менеджер и т. Д. Факт о механизме Employee заключается в том, что он может быть объектом привязки данных или может быть сериализован на диск или что угодно. Сотрудник не может быть сериализован на диск, но может быть класс. Атрибуты позволяют отделять информацию о технических деталях от семантической модели.

Есть ли способ создать свои собственные атрибуты?

Да. Создайте класс, который расширяет атрибут. По соглашению вы хотите назвать его «FooAttribute». Если вы это сделаете, вы можете использовать синтаксис [Foo] или синтаксис [FooAttribute] по своему усмотрению.

Как я могу определить, установлены ли в этих атрибутах поля/методы/классы/какие-либо конкретные атрибуты или какие значения установлены?

Используйте метод GetCustomAttributes для объектов отражения.

Где я должен читать для получения дополнительной информации?

Начало с учебником атрибутами:

http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspx

А потом прочитать все главы 17 C# спецификации.

5

Я думаю, что ответ на следующий вопрос предоставит вам некоторое представление о ваших вопросах.

How do attribute classes work?

Вот репост ответа я предоставил.

Атрибуты - это по существу метаданные, которые могут быть прикреплены к различным частям вашего кода. Эти метаданные могут затем быть взаимозависимыми и влиять на поведение определенных операций.

Атрибуты могут применяться практически ко всем аспектам вашего кода. Например, атрибуты могут быть связаны на уровне Ассамблеи, такие как атрибуты AssemblyVersion и AssemblyFileVersion, которые определяют номера версий, связанные с сборкой.

[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

Затем Сериализуемый атрибут, например, может быть применен к декларации типа с флагом типа, как поддержка сериализации. Фактически этот атрибут имеет особое значение в 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. Фактически экземпляры атрибутов создаются только тогда, когда вы действительно запрашиваете атрибуты в первый раз.

7

Attributes - это средство, с помощью которого вы можете связывать метаданные с типами в .NET. Это позволяет вам проверять тип и получать информацию об этом отдельно от информации о времени выполнения.

Это может быть очень полезно. Вы упомянули [Serializable], но другие простые примеры включают в себя многие типы System.ComponentModel, такие как Description, которые используются сеткой свойств для «описания» свойств при работе с ними в дизайнере. Поскольку «описание» свойства действительно не связано с поведением типа в программе (во время выполнения), оно не относится к классу. Тем не менее, это очень удобно, когда вы редактируете элемент управления в визуальном дизайнере, например, чтобы увидеть описание (или категорию и т. Д.) Свойства. Атрибуты - это средства, с помощью которых это обрабатывается.

+2

, вы можете создать свой собственный атрибут наследующий от класса System.Attribute и определяющий его область для запроса класса/методов, украшенных атрибутом, который можно использовать для отражения foreach (var attrib в typeof (YOURCLASS) .GetCustomAttributes()) – Rony

0

В C# предусмотрен механизм определения декларативных тегов, называемых атрибутами, которые вы можете поместить на определенные объекты в исходном коде, чтобы указать дополнительную информацию. Информация, которую содержат атрибуты, может быть получена во время выполнения через отражение. Вы можете использовать предопределенные атрибуты или вы можете определить свои собственные атрибуты.

http://msdn.microsoft.com/en-us/library/aa288059%28v=VS.71%29.aspx

Смежные вопросы