Questo può essere fatto facilmente con un sistema di programma di trasformazione.
DMS Software Reengineering Toolkit Il DMS Software Reengineering Toolkit è un sistema di trasformazione di programma generico e può essere utilizzato con molte lingue (C++, COBOL, Java, EcmaScript, Fortran, ..) e in particolare con C#.
DMS analizza il codice sorgente, crea Abstract Syntax Trees e consente di applicare pattern source-to-source per trasformare il codice da un programma C# a un altro con qualsiasi proprietà desideri. La regola di trasformazione per realizzare esattamente il compito specificato sarebbe:
domain CSharp.
insert_trace():method->method
"[Trace]
\visibility \returntype \methodname(string \parametername)
{ \body } "
->
"\visibility \returntype \methodname(string \parametername)
{ Log.Trace(\CSharpString\(\methodname\),
\CSharpString\(\parametername\),
\parametername);
\body } "
le virgolette (") non sono marchi CSharp quote; anzi, sono 'le citazioni di dominio', e indicano che il contenuto all'interno delle virgolette è la sintassi CSharp (perché abbiamo detto: "CSharp dominio"). le notazioni \ Foo sono meta di sintassi.
Questa regola corrisponde al AST che rappresenta il metodo specificato con il [Trace] annotazioni, e riscrive che AST in la traccia tracciata, l'AST risultante viene quindi riportato di nuovo in forma di origine, che è possibile compilare. Probabilmente occorrono altre regole per gestire altre combinazioni di argomenti; agire, probabilmente si generalizza l'elaborazione dell'argomento per produrre (dove possibile) un valore stringa per ogni argomento scalare.
Dovrebbe essere chiaro che si può fare molto di più del semplice logging con questo, e molto più della semplice programmazione orientata all'aspetto, dal momento che è possibile esprimere trasformazioni arbitrarie e non solo azioni pre-dopo.
fonte
2009-08-31 05:05:18
Non ho mai studiato le prestazioni del codice PostSharpened, ma sarei sorpreso se lo spessore PostSharp facesse una differenza significativa. – RichieHindle
Non riesco a fare ciò che voglio fare con PostSharp Loas (plugin AOP per PostSharp), ma posso farlo scrivendo un plugin AOP personalizzato per PostSharp. Sebbene PostSharp Loas possa avere influito sulle prestazioni in fase di runtime, il mio plug-in personalizzato non funzionerà poiché sarà solo in fase di compilazione. –