Question

Pour quel type d'objets avez-vous utilisé des attributs .NET personnalisés dans le monde réel?

J'ai lu plusieurs articles à leur sujet, mais je n'ai jamais utilisé d'attributs personnalisés.

Je sens que je pourrais les oublier quand ils pourraient être utiles.

Je parle d'attributs que vous créez, pas de ceux qui sont déjà inclus dans le cadre.

Était-ce utile?

La solution

Je les ai utilisés "personnalisé". Attributs de validation (par exemple, marquer un champ à valider avec mes propres "validations de carte de crédit") et les analyseurs LinqToLucene personnalisés que j'ai écrits (c.-à-d. en spécifiant quel analyseur utiliser sur un champ donné).

Le code de validation, par exemple, devrait ressembler à ceci:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Lorsque l'objet ci-dessus est validé, chaque champ est validé avec le validateur approprié grâce au paramètre "personnalisé". attribut.

Dans LinqToLucene, les attributs personnalisés que j’ai écrits sont bien car ils vous permettent de trouver (par réflexion) des champs spécifiques au moment de l’exécution. Par exemple, si vous avez un objet client, vous voudrez peut-être obtenir toutes les propriétés qui ont été marquées comme "indexez-moi": un attribut personnalisé vous permet de le faire facilement car il expose les métadonnées sur l'objet de manière c'est facile à interroger.

Autres conseils

J'ai créé un moteur de script et marqué diverses méthodes avec l'attribut [Commande]. Cela signifiait que ces fonctions étaient exposées au moteur de script.

Exemple:

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

}

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

}

Et comme utilisé:

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

Je les ai notamment utilisés pour spécifier EBNF, qui est lu au moment de l'exécution pour créer des analyseurs syntaxiques personnalisés à la volée, ainsi que pour spécifier des métadonnées sur les champs d'une base de données.

Je trouve qu’un «motif» que j’utilise couramment avec des attributs personnalisés consiste à remplacer les énumérations en particulier, surtout s’il existe une dépendance à l’énum en différents endroits du code.

E.g. Je pourrais avoir une enum pour l'état d'un objet. Sur la base de cet état, j'ai peut-être 3 ou 4 endroits différents dans le code pour lesquels je ferais un "basculement" de cette énumération et effectuerais une opération. Un autre développeur pourrait facilement introduire un bogue en ajoutant une nouvelle énumération mais en ne gérant pas l’une des instructions switch ailleurs dans le code.

Pour éviter cela, je crée un attribut personnalisé déclaré dans une classe statique. Les attributs personnalisés sont chargés dans le constructeur statique de la classe dans un dictionnaire et tous les emplacements dans le code utilisent le dictionnaire au lieu d'instructions switch. Le constructeur d'attributs personnalisés contient les valeurs "codées en dur" pour chaque instruction de commutateur.

J'ai dû sérialiser certains objets dans un format personnalisé (existant) et j'ai utilisé des attributs pour identifier les champs à sérialiser et comment les formater. Ensuite, j'ai eu un sérialiseur qui pouvait prendre n'importe quel objet avec ces attributs et utiliser la réflexion pour le formater.

Je n'ai pas encore trouvé d'utilisation pour les attributs personnalisés. Il y a eu quelques situations où je pensais qu'elles pouvaient être appropriées mais ne les utilisaient pas car apparemment, la réflexion impliquée dans la lecture d'attributs personnalisés est assez coûteuse.

J'ai placé des attributs personnalisés sur les classes de "plug-in". DLL. Cela permet à un framework de découvrir de manière dynamique les plug-ins disponibles, d'évaluer s'ils présentent un intérêt, puis de charger dynamiquement ceux qui présentent un intérêt.

Dans notre domaine, l'exemple concerne les plug-ins modélisant des véhicules particuliers au sein d'une famille. Un plug-in pour une famille de véhicules peut en fait modéliser plusieurs modèles de véhicules dans la famille de véhicules (par exemple, "MX-6", "Probe"). Si un ID ou un nom de modèle est inclus en tant que tableau d'attributs personnalisés, nous pouvons rapidement ignorer les DLL n'ayant même pas d'attributs personnalisés, puis ignorer celles qui ne modélisent pas le véhicule qui vous intéresse.

Je l'avais utilisé dans l'un des frameworks ORM que j'avais développés sur la base du modèle ActiveRecord. Il s’agit du même type d’implémentation disponible dans LINQ, le projet Castle, etc.

Le cadre s'appelait "SkyFramework", mais ce n'était pas un open source.

par exemple Juste un exemple approximatif ...

Vous trouverez également des exemples similaires dans d'autres projets opensource.

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

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

REMARQUE: l’attribut "Table", "Colonnes". étaient les attributs personnalisés à ce moment-là.

Le moteur ActiveRecord analyse l'objet pour ces attributs et génère les fonctions respectives pour CRUD ... etc ...

De même, j’ai développé des attributs personnalisés permettant d’identifier des portions de code devant faire l’objet d’un benchmark, par exemple.

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

Les méthodes marquées avec les attributs ci-dessus sont automatiquement marquées et un journal est généré. C'étaient des implémentations antérieures.

Un livre d’apress est disponible sur le sujet. Attributs .NET appliqués pouvant vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top