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

Technorati Tags: ,