2013-06-17 21 views
9

ho lottato per trovare esempi di come scrivere un attributo personalizzato per convalidare i parametri del metodo, vale a dire, trasformare questa forma:Come utilizzare parametro del metodo attributi

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

in questo:

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

per quanto posso dire, ho bisogno di aggiungere questo attributo al mio attributo personalizzato, ma io sono in perdita su come accedere al parametro decorato 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); 
     } 
    } 
} 
+0

Perché non puoi semplicemente accettare un'interfaccia come parametro? Ad esempio, potresti avere un IDoSomething. –

+2

Non è possibile accedere all'elemento decorato dall'interno dell'attributo. Gli attributi si posizionano in modo statico contro i metadati di tipo, quindi ottieni effettivamente l'attributo dall'elemento. Detto questo, l'attributo potrebbe quindi avere un metodo che accetta un argomento che è l'elemento, ma poi stai usando una mazza per rompere un noce e avresti potuto farlo molto più facilmente senza attributi. –

risposta

15

Lo stai applicando correttamente - ma un attributo in fondo non conosce il membro a cui fa riferimento. Ciò rende sicuramente la vita più difficile.

Non solo non ha accesso al membro che si riferisce, ma questo membro sarebbe un ParameterInfo, non un Client - non c'è modo semplice per accedere al valore di un parametroesternamente. Il tuo metodo avrebbe bisogno di chiamare un codice helper, passando il valore di per gestirlo appropriatamente ... o devi collegare il codice che chiamerà il tuo metodo per iniziare, in modo da notare l'attributo.

Non è chiaro esattamente come speravi di usarlo, ma potrebbe anche essere necessario modificare in modo significativo il tuo progetto.

0

Gli attributi dovrebbero probabilmente essere inseriti nel metodo stesso. Quando stavo cercando la soluzione ho trovato il seguente link e il modo in cui utilizza l'intercettore sembra ancora meglio http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html

+0

Puoi spiegarci un po 'di più? –

+0

Potrei aver frainteso il codice originale. Il link che ho pubblicato utilizza l'intercettore per convalidare il codice. Il commento non mi consente di inserire il codice da lì. Mi sembra solo che questa soluzione sia più elegante della convalida degli attributi che abbiamo fatto in passato. – Tony

2

Gli attributi non sono sufficienti per farlo.

Se ho capito bene, si desidera aggiungere un attributo su un parametro per convalidarlo in fase di esecuzione e ciò è impossibile solo con gli attributi.

Impossibile perché gli attributi sono solo "metadati" e codice non eseguito.

Avrai bisogno di un codice "reale" per leggerlo e agire di conseguenza. Tale codice può essere iniettato in fase di compilazione o è possibile collegarsi all'esecuzione della funzione.

Problemi correlati