Frage

Welche Dinge haben Sie verwendet, um benutzerdefinierte .NET-Attribute für in der realen Welt?

Ich habe mehrere Artikel über sie zu lesen, aber ich habe nie benutzerdefinierte Attribute verwendet.

Ich fühle mich wie ich sie könnte mit Blick auf, wenn sie nützlich sein könnte.

Ich spreche über Attribute, die Sie erstellen, nicht diejenigen, die im Rahmen bereits enthalten sind.

War es hilfreich?

Lösung

ich sie verwendet habe „custom“ Attribute für die Validierung (dh. Eine Feldmarkierung mit meiner eigenen „Kreditkartenvalidierung“ validiert wird) und benutzerdefinierte LinqToLucene Analysatoren ich geschrieben habe (dh. Sie angeben, welcher Analysator auf einem verwenden, Feld ein).

Der Validierungscode, zum Beispiel würde wie folgt aussehen:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Wenn das Objekt über validiert ist, jedes Feld mit dem entsprechenden Validator dank des „custom“ Attribut validiert wird.

In den LinqToLucene Sachen, die ich geschrieben habe benutzerdefinierte Attribute sind nett, weil sie ermöglichen es Ihnen (durch Reflexion) bestimmte Felder zur Laufzeit zu finden. Zum Beispiel, wenn Sie ein Kundenobjekt haben, können Sie in immer alle Eigenschaften interessiert sein, die als „Index me“ markiert wurden: ein benutzerdefiniertes Attribut können Sie dies tun, einfach weil es Meta-Daten über das Objekt in einer Weise aussetzt, dass Abfrage ist leicht zu.

Andere Tipps

habe ich ein Scripting-Engine und verschiedene Methoden mit dem [Befehl] Attribute markiert. Dies bedeutete, dass diese Funktionen auf die Scripting-Engine ausgesetzt waren.

Beispiel:

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

}

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

}

Und wie verwendet:

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>>

Unter anderem hat ich sie verwendet, um anzugeben EBNF, die zur Laufzeit gelesen wird benutzerdefinierten Parser on the fly zu erstellen und auch Metadaten über Felder für eine Datenbank angeben.

Ich finde, ein ‚Muster‘ ich häufig bin mit benutzerdefinierten Attributen sind Aufzählungen besonders zu ersetzen, wenn es eine Abhängigkeit von der ENUM in diff Stellen im Code ist.

z. Ich könnte eine ENUM für einen Zustand eines Objekts haben. Basierend auf diesem Zustand habe ich vielleicht 3 oder 4 verschiedene Stellen im Code, die ich einen ‚Schalter‘ dieser Enum tun würde, und eine Operation durchführen. Einige andere Entwickler könnte leicht einen Fehler einführen, indem eine neue Enum Zugabe, aber nicht irgendwo anders in einem der Switch-Anweisungen Handhabung im Code.

So, dies zu vermeiden ich erstellen Sie eine benutzerdefinierte Attribute auf eine statische Klasse deklariert. Die benutzerdefinierten Attribute werden im statischen Konstruktor der Klasse in ein Wörterbuch und alle Orte im Code verwenden, um die Wörterbuch statt switch-Anweisungen geladen. Das benutzerdefinierte Attribut Konstruktor enthält die ‚hart codiert‘ Werte für jeden Switch-Anweisung.

Ich hatte einige Objekte in eine benutzerdefinierte (Legacy) Format serialisiert werden, und ich verwendeten Attribute, die identifizieren Felder serialisiert werden soll und wie sie zu formatieren. Dann hatte ich einen Serializer, dass jedes Objekt mit diesen Attributen und Verwendung Reflexion nehmen könnte es zu formatieren.

Ich habe gefunden, nicht wirklich eine Verwendung für individuelle als die noch Attribute. Es gibt einige Situationen, in denen ich thaught sie geeignet sein, sie aber nicht verwenden, weil offenbar die Reflexion im Lesen benutzerdefinierte Attribute beteiligte recht teuer ist.

Ich habe platziert benutzerdefinierte Attribute auf Klassen in „Plug-in“ DLLs. Dies ermöglicht ein Framework, um dynamisch entdeckt verfügbare Plug-In, zu bewerten, ob sie von Interesse ist, und dann dynamisch diejenigen von Interesse laden.

In unserer Domäne ist die Beispiel-Plug-In, welches Modell insbesondere Fahrzeuge innerhalb einer Familie. Ein Plug-in für ein Fahrzeugfamilie könnte tatsächlich modelliert mehrere Fahrzeugmodelle innerhalb der Fahrzeugfamilie (z.B. „MX-6“, „Probe“). Wenn eine ID oder Modellname als benutzerdefinierte Attribute Array enthalten ist, können wir schnell alle DLLs ignorieren, die nicht einmal benutzerdefinierte Attribute haben, und dann weiter jede ignorieren, die das Fahrzeug von Interesse nicht modelliert werden.

hatte ich es in einem der ORM-Frameworks verwendet, die ich auf dem Active Record basierend entwickelt. Dies ist die gleiche Art der Implementierung, die in LINQ, Castle Projekt usw. zur Verfügung.

Der Rahmen wurde "SkyFramework" genannt, aber es war nicht Open Source.

für z.B. Nur ein grobes Beispiel ...

Sie werden auch ähnliche Beispiele in anderen Open-Source-Projekten.

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

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

. Hinweis: Das Attribut "Table", "Spalten" waren die Gewohnheit zu dieser Zeit Attribute

Der Active Motor parst das Objekt für diese Attribute und erzeugt die entsprechenden Funktionen für die CRUD ... etc ...

In ähnlicher Weise hatte ich einige benutzerdefinierte Attribute zur Identifizierung Teile des Codes entwickelt, die verglichen werden muss ... für z ..

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

Die Methoden mit den oben genannten Eigenschaften gekennzeichnet sind automatisch Bank markiert und ein Protokoll erstellt. Dies waren einige frühere Implementierungen.

Es gibt ein Apress Buch zum Thema zur Verfügung .. Applied .NET Attribues die Ihnen behilflich sein können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top