Można to łatwo zrobić z systemem transformacji programu.
DMS Software Reengineering Toolkit jest uniwersalnym programem do transformacji programów i może być używany z wieloma językami (C++, COBOL, Java, EcmaScript, Fortran, ...), a zwłaszcza z C#.
DMS analizuje kod źródłowy, kompiluje abstrakcyjne drzewka składni i umożliwia stosowanie wzorów źródłowych do kodu źródłowego w celu przekształcenia kodu z jednego programu C# do innego z dowolnymi właściwościami. Zasadą transformacji do osiągnięcia dokładnie zadanie określono byłoby:
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 } "
Znaki cudzysłów (") nie są znakami CSharp cytat, ale raczej są«cytaty domena»i wskazują, że zawartość wewnątrz cudzysłowów jest składnia CSharp (bo powiedział: „CSharp domeny”). zapisy \ Foo są składnia meta.
zasada ta odpowiada AST reprezentujący metodę określoną z przycisk [nazwiska] adnotacji i przepisuje że AST na Wynikowy AST jest następnie odręczny z powrotem do formy źródłowej, którą możesz skompilować. Prawdopodobnie potrzebujesz innych reguł do obsługi innych kombinacji argumentów; działa, prawdopodobnie uogólnisz przetwarzanie argumentów, aby wytworzyć (jeśli jest to praktyczne) wartość ciągu dla każdego argumentu skalarnego.
Powinno być jasne, że można zrobić o wiele więcej niż tylko rejestrowanie za pomocą tego i znacznie więcej niż tylko programowanie zorientowane na aspekt, ponieważ można wyrażać dowolne transformacje, a nie tylko działania poprzedzające.
Nigdy nie badałem wydajności kodu PostSharpened, ale byłbym zaskoczony, gdyby podkładka PostSharp zrobiła znaczącą różnicę. – RichieHindle
Nie mogę zrobić tego, co chcę zrobić z PostSharp Loas (wtyczka AOP dla PostSharp), ale mogę to zrobić, pisząc niestandardową wtyczkę AOP dla PostSharp. Chociaż PostSharp Loas mógł wpłynąć na wydajność w czasie wykonywania, moja niestandardowa wtyczka nie będzie, ponieważ będzie to tylko czas kompilacji. –