8

Какими вещами вы пользовались пользовательскими атрибутами .NET в реальном мире?Использование пользовательских атрибутов .NET в реальном мире

Я прочитал несколько статей о них, но никогда не использовал пользовательские атрибуты.

Я чувствую, что, возможно, я буду игнорировать их, когда они могут быть полезны.

Я говорю об атрибутах, которые вы создаете, а не о тех, которые уже включены в структуру.

+2

Вот как это делают другие SOFlow'rs: http://www.google.com/#hl=ru&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson

ответ

4

Я использовал их «пользовательские» атрибуты для проверки (например, отметку поля для проверки с помощью собственной «проверки кредитной карты») и пользовательских анализаторов LinqToLucene, которые я написал (то есть, указав, какой анализатор использовать на заданное поле).

Код проверки, например, будет выглядеть примерно так:

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

Когда над объектом проверяются, каждое поле проверяется с соответствующим валидатором благодаря атрибуту «обычая».

В материалах LinqToLucene я написал пользовательские атрибуты, потому что они позволяют вам находить (через отражение) определенные поля во время выполнения. Например, если у вас есть объект клиента, вам может быть интересно получить все свойства, которые были помечены как «index me»: пользовательский атрибут позволяет вам делать это легко, поскольку он предоставляет метаданные об объекте таким образом, чтобы легко запросить.

0

Мне пришлось сериализовать некоторые объекты в пользовательском (унаследованном) формате, и я использовал атрибуты для определения того, какие поля должны быть сериализованы и как их форматировать. Затем у меня был сериализатор, который мог бы взять любой объект с этими атрибутами и использовать отражение для его форматирования.

+0

You weren ' действительно ли вы использовали свои собственные атрибуты? –

+0

heeeeeeeeeeeeee – abmv

0

Я использовал его в одной из рамок ORM, которые я разработал на основе шаблона ActiveRecord. Это тот же вид реализации, который доступен в проекте LINQ, Castle и т. Д.

Рамка была названа «SkyFramework», но она не была открыта.

, например. Примерный пример ...

Аналогичные примеры вы найдете в других проектах с открытым исходным кодом.

[Sky.Table ("user")] 
public class User 
{ 
    [Sky.Column ("username")] 
    public string UserName; 

    [Sky.Column ("pwd")] 
    public string Password; 
} 

Примечание: Атрибут «Таблица», «Столбцы» были пользовательские атрибуты в то время.

Двигатель ActiveRecord анализирует объект для этих атрибутов и генерирует соответствующие функции для CRUD ... и т.д. ...

Аналогичным образом, я разработал некоторые пользовательские атрибуты для идентификации части коды, который должен быть протестированным. .. для, например,

[Sky.BenchMark()] 
public void LongRunningMethod(..) 
{ 
} 

Методы, отмеченные вышеуказанными атрибутами, автоматически помечены скамейкой и создается журнал. Это были некоторые более ранние реализации.

Доступна книга Apress по теме .. Applied .NET Attribues, которая может вам помочь.

+0

Вы пишете атрибуты? –

+0

Столбец, столбец, BenchMark и т. Д. - это объекты, полученные из класса Attribute. Кроме того, механизмы анализатора заботятся о его обработке. Эти объекты всегда создаются на каком-то фабричном классе, поэтому вы можете получить доступ к методам. –

+0

И, пожалуйста, не путайте аналогичный атрибут LINQ, который у вас есть сейчас. Это старый бит кода, где атрибуты лежали в собственном пространстве имен. –

1

Среди прочего, я использовал их для указания EBNF, который читается во время выполнения для создания пользовательских парсеров «на лету», а также для указания метаданных о полях для базы данных.

Я нахожу один «узор». Я обычно использую настраиваемые атрибуты, чтобы заменить перечисления, особенно когда есть зависимость от перечисления в местах разложения в коде.

E.g. Я мог бы перечислить состояние объекта. Основываясь на этом состоянии, у меня может быть 3 или 4 разных места в коде, которые я бы сделал «переключатель» этого перечисления и выполнил некоторую операцию. Некоторый другой разработчик мог легко ввести ошибку, добавив новое перечисление, но не обращаясь в одном из операторов switch в другом месте кода.

Чтобы избежать этого, я создаю пользовательские атрибуты, объявленные статическому классу. Пользовательские атрибуты загружаются в статический конструктор класса в словарь, а все места в коде используют словарь вместо операторов switch. Конструктор настраиваемых атрибутов содержит «жестко закодированные» значения для каждого оператора switch.

5

Я создал механизм сценариев и пометил различные методы атрибутом [Command]. Это означало, что эти функции были подвержены движку сценариев.

Пример:

[Command(HelpText = "Lists active users")] 
void ListUsers(void) 
{ 

} 

[Command(HelpText = "Terminate a specific user's connection")] 
void EndConnection(int userID) 
{ 

} 

И как он используется:

MyScriptEngine>> Help 
Available Commands are: 
    ListUsers: Lists active users 
    EndConnection {userID}: Terminate a specific user's connection 

MyScriptEngine>> EndConnection 3 
    User 3 (Michael) has had his connection terminated. 

MyScriptEngine>> 
0

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

0

Я поместил пользовательские атрибуты в классы внутри «подключаемых» DLL-файлов. Это позволяет платформе динамически обнаруживать доступные плагины, оценивать, представляют ли они интерес, а затем динамически загружать интересующие их.

В нашем домене примером являются подключаемые модули, которые моделируют определенные транспортные средства внутри семьи. Один плагин для семейства автомобилей может фактически моделировать несколько моделей автомобилей в семействе автомобилей (например, «MX-6», «Probe»). Если идентификатор или имя модели включены как настраиваемый массив атрибутов, мы можем быстро игнорировать любые DLL, у которых даже нет пользовательских атрибутов, а затем игнорировать все, которые не моделируют интересующее транспортное средство.

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