8

Jakiego rodzaju rzeczy używasz niestandardowych atrybutów .NET w prawdziwym świecie?Używanie niestandardowych atrybutów .NET w świecie rzeczywistym

Przeczytałem kilka artykułów na ich temat, ale nigdy nie użyłem niestandardowych atrybutów.

Czuję, że mogę ich nie zauważyć, gdy mogą być przydatne.

Mówię o atrybutach, które tworzysz, a nie tych, które są już zawarte w strukturze.

+2

Oto, jak używają ich inni użytkownicy SOFlow: http://www.google.com/#hl=en&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson

Odpowiedz

4

Użyłem ich "niestandardowych" atrybutów do sprawdzania poprawności (np. Zaznaczenie pola do sprawdzenia poprawności za pomocą mojej "walidacji karty kredytowej") i niestandardowych analizatorów LinqToLucene, które napisałem (tj. Określenie, który analizator ma być używany na dane pole).

Kod walidacji, na przykład, będzie wyglądać tak:

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

Gdy obiekt powyżej jest potwierdzone, każde pole jest weryfikowany z odpowiednimi Walidator dzięki atrybutu „niestandardowy”.

W materiałach LinqToLucene napisałem niestandardowe atrybuty są ładne, ponieważ pozwalają na znalezienie (poprzez odbicie) konkretnych pól w czasie wykonywania. Na przykład, jeśli masz obiekt klienta, możesz być zainteresowany uzyskaniem wszystkich właściwości, które zostały oznaczone jako "indeksuj mnie": atrybut niestandardowy pozwala to łatwo zrobić, ponieważ udostępnia metadane dotyczące obiektu w sposób, który łatwo jest zapytać.

0

Musiałem serializować niektóre obiekty do niestandardowego (starszego) formatu, a ja użyłem atrybutów, aby zidentyfikować, które pola mają być serializowane i jak je sformatować. Potem miałem serializator, który mógł wziąć dowolny obiekt z tymi atrybutami i użyć odbicia, by go sformatować.

+0

You weren ' Czy naprawdę używasz własnych niestandardowych atrybutów, prawda? –

+0

heeeeeeeeeeeeee – abmv

0

Użyłem go w jednym z frameworków ORM, które opracowałem w oparciu o wzór ActiveRecord. Jest to ten sam rodzaj implementacji, który jest dostępny w LINQ, projekcie Castle itp.

Framework został nazwany "SkyFramework", ale nie był to opensource.

np. Tylko przybliżony przykład ...

Podobne przykłady znajdziesz także w innych projektach typu open source.

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

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

UWAGA: Atrybut „Stół”, „Kolumny” były atrybuty niestandardowe w tym czasie.

Silnik ActiveRecord analizuje obiekt dla tych atrybutów i generuje odpowiednie funkcje CRUD ... etc ...

Podobnie miałem opracowany niektórych niestandardowych atrybutów do identyfikacji fragmentów kodu, które muszą być porównywana. .. na przykład

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

Metody oznaczone powyższymi atrybutami są automatycznie oznaczane na stole i generowany jest dziennik. To były wcześniejsze implementacje.

Na ten temat dostępna jest książka Apress. Applied .NET Attribues, która może być pomocna.

+0

Czy napisałeś atrybuty? –

+0

Tabela, kolumna, BenchMark itp. To obiekty pochodne od klasy Atrybut. Poza tym silniki parsera dbają o jego obsługę. Obiekty te są zawsze tworzone przez pewną klasę fabryczną, dzięki czemu można uzyskać dostęp do metod. –

+0

Proszę nie mylić z podobnym atrybutem LINQ, który masz teraz. To jest stary kawałek kodu, w którym atrybuty leżały w jego własnej przestrzeni nazw. –

1

Między innymi użyłem ich do określenia EBNF, który jest odczytywany w czasie wykonywania, aby tworzyć w locie niestandardowe analizatory składni, a także do określania metadanych dotyczących pól dla bazy danych.

Uważam, że jednym "wzorem", z którego często używam atrybutów niestandardowych, jest zastępowanie wyliczeń, szczególnie gdy istnieje zależność od wyliczenia w różnych miejscach kodu.

E.g. Mogę mieć wyliczenie dla stanu obiektu. Na podstawie tego stanu, mam może 3 lub 4 różne miejsca w kodzie, co zrobiłbym "przełączenie" tego wyliczenia i wykonałem operację. Inny programista może łatwo wprowadzić błąd, dodając nowe wyliczenie, ale nie korzystając z instrukcji przełączania w innym miejscu kodu.

Aby tego uniknąć, utworzę niestandardowe atrybuty zadeklarowane dla klasy statycznej. Niestandardowe atrybuty są ładowane do konstruktora statycznego klasy w słowniku, a wszystkie miejsca w kodzie używają słownika zamiast instrukcji switch. Konstruktor atrybutów niestandardowych zawiera "zakodowane" wartości dla każdej instrukcji switch.

5

Stworzyłem silnik skryptów i otagowałem różne metody za pomocą atrybutu [Command]. Oznaczało to, że te funkcje były narażone na działanie mechanizmu skryptów.

Przykład:

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

} 

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

} 

I jak stosować:

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

ja naprawdę nie znalazł zastosowanie dla niestandardowych atrybutów jak dotąd. Było kilka sytuacji, w których dowiedziałem się, że mogą być odpowiednie, ale ich nie używałem, ponieważ widocznie refleksja związana z odczytywaniem niestandardowych atrybutów jest dość kosztowna.

0

Umieściłem niestandardowe atrybuty na klasach w bibliotekach DLL typu "plug-in". Umożliwia to dynamiczne wykrywanie dostępnych wtyczek, ocenianie ich, a następnie dynamiczne ładowanie interesujących.

W naszej domenie przykładem są wtyczki, które modelują poszczególne pojazdy w rodzinie. Jedna wtyczka dla rodziny pojazdów może faktycznie modelować kilka modeli pojazdów z rodziny pojazdów (np. "MX-6", "Sonda"). Jeśli identyfikator lub nazwa modelu zostanie uwzględniona jako niestandardowa tablica atrybutów, możemy szybko zignorować wszystkie biblioteki DLL, które nie mają nawet niestandardowych atrybutów, a następnie zignorować te, które nie modelują pojazdu będącego przedmiotem zainteresowania.

Powiązane problemy