Mi riallaccio al post di ieri per fare una precisazione, faccio un nuovo post perchè fare un update dell’altro è pressochè impossibile… sopportatemi ;-)
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:
 image_thumb8
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:
image
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