AOP, C# e PostSharp… Update
Ieri ho detto che: “…quello che però non ha fatto è stato rimettere sul parametro del metodo privato l’attributo, e questo credo sia un bug, vedremo…;”
Riferendomi a questa situazione:
[ArgumentValidatorAspect()] class MyTestClass { public void Foo( [NotNull]String arg ) { Console.WriteLine( "Foo:" + arg ); } }e compilando il risultato che otteniamo, visto con il fido Reflector, è questo:
cioè l’attributo NotNullAtrtribute è rimasto sul metodo pubblico e non si è “spostato” su quello privato, nel nostro caso questo è un fastidio obbligandoci a fare giri strani per recuperare gli attributi applicati ai parametri.
Orbene, è possibile ottenere il comportamento desiderato istruendo opportunamente il post compilatore di PostSharp:
[assembly: PostSharp.Extensibility.ImplementationBoundAttribute( typeof( NotNullAttribute ) )]In questo modo stiamo dicendo a PostSharp che vogliamo che il nostro attributo venga “spostato” e legato all’implementazione, ottenendo di fatto questo:
che è esattamente quello che ci serve.
Adesso abbiamo un altro fastidio… :-D se cerchiamo dall’esterno di analizzare la classe MyTestClass non sapremo mai che uno dei parametri del metodo Foo() è marcato con l’attributo NotNull questo perchè a tutti gli effetti non lo è più. Ho quindi chiesto all’autore se è possibile avere un comportamento misto avendo cioè l’attributo da entrambe le parti, vediamo che ci dice…
Buona domenica,
.m