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);
}
}
}
Perché non puoi semplicemente accettare un'interfaccia come parametro? Ad esempio, potresti avere un IDoSomething. –
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. –