16 votes

Comment utiliser les attributs des paramètres de méthode

J'ai eu du mal à trouver des exemples sur la façon d'écrire un attribut personnalisé pour valider les paramètres d'une méthode, c'est-à-dire tourner ce formulaire :

public void DoSomething(Client client)
{
    if (client.HasAction("do_something"))
    {
        // ...
    }
    else
    {
        throw new RequiredActionException(client, "do_something");
    }
}

dans ceci :

public void DoSomething([RequiredAction(Action="some_action")] Client client)
{
    // ...
}

D'après ce que je sais, je dois ajouter cet attribut à mon attribut personnalisé, mais je ne sais pas comment accéder au paramètre décoré. Client :

[AttributeUsageAttribute(AttributeTargets.Parameter)]
public class RequireActionAttribute : System.Attribute
{
    public Type Action {get; set;}

    public RequireActionAttribute()
    {
        // .. How do you access the decorated parameter?
        Client client = ???

        if (!client.HasAction(Action))
        {
            throw new RequiredActionException(client, Action);
        }
    }
}

21voto

Jon Skeet Points 692016

Vous l'appliquez correctement - mais un attribut ne connaît pas le membre auquel il se réfère. Cela rend définitivement la vie plus difficile.

Non seulement il n'a pas accès au membre auquel il se réfère, mais ce membre serait un ParameterInfo et non un Client - il n'y a pas de moyen facile d'accéder à la valeur d'un paramètre en externe. Votre méthode devra appeler un code d'aide, en passant la valeur du paramètre client afin de le gérer de manière appropriée... ou vous devez vous accrocher au code qui va appeler votre méthode pour commencer, afin de remarquer l'attribut.

On ne sait pas exactement comment vous espériez l'utiliser, mais il se peut que vous deviez modifier considérablement votre conception.

6voto

silver Points 18

Les attributs ne sont pas suffisants pour le faire.

Si j'ai bien compris, vous voulez ajouter un attribut à un paramètre afin de le valider au moment de l'exécution et cela n'est possible qu'avec des attributs.

C'est impossible car les attributs ne sont que des "métadonnées" et non du code exécuté.

Vous aurez besoin d'un "vrai" code pour le lire et agir en conséquence. Ce code peut être injecté au moment de la compilation ou vous pouvez vous connecter à l'exécution de la fonction.

1voto

Tony Points 125

Les attributs devraient probablement être placés sur la méthode elle-même. En cherchant la solution, j'ai trouvé le lien suivant et la façon dont il utilise l'intercepteur me semble encore meilleure. http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X