Last time(http://msprogrammer.serviciipeweb.ro/2017/11/27/aop-with-roslynpart-2/) we have injected a new code into each method . However, this code was pretty much hardcoded into the MethodRewriter class – it was a simple

Console.WriteLine(\”{nameClass}_{nameMethod}_{lineStartNumber}\”);

Now we want to can customize this code at the will of the programmer. For this, I have modified classes RewriteCode and MethodRewriter to accept a parameter named Formatter . To run the test that worked previously, I made a parameterless constructor for RewriteCode in order to preserve compatiblity.

public RewriteCode(): this("Console.WriteLine(\"{nameClass}_{nameMethod}_{lineStartNumber}\");") { } public RewriteCode(string formatter) { Formatter = formatter; }



The VisitMethod is now much simpler:

string nameVariable =Formatter.FormatWith(new { nameClass,nameMethod,lineStartNumber=lineStart.Line}); var cmd = SyntaxFactory.ParseStatement(nameVariable);



( The .FormatWith is an extension from https://github.com/crozone/FormatWith )



Also, I have made a new test to test this one – and I have inserted into code an variable named s:



string s=\”this is method {nameMethod} from class {nameClass} at line {lineStartNumber}\”;”





The test is

[TestMethod] public void TestMethodRewriterAddVariable() { var rc = new RewriteCode( "string s=\"this is method {nameMethod} from class {nameClass} at line {lineStartNumber}\";" ); rc.Code = @" using System; namespace Test1 { class Program { static void Main(string[] args) { var dt=DateTime.Now; } } }"; var result = rc.RewriteCodeMethod(); var newCode = @" using System; namespace Test1 { class Program { static void Main(string[] args) { string s = ""this is method Main from class Program at line 6""; var dt = DateTime.Now; } } }"; Assert.AreEqual(result.Replace(Environment.NewLine, ""), newCode.Replace(Environment.NewLine, "")); } }