A példaalkalmazással egy olyan kódot generálunk, melyet futtatva a parancssori argumentumként átadott számokat összeadja úgy, hogy a két szám karakterláncként átadódik a létrehozandó objektum konstruktorának.
A programban megadható a generálandó névtér és az osztály neve, valamint a két szám egy-egy szerkesztőmezőben.
A GENERÁLÁS gombra kattintva a következő műveleteket fogjuk elvégezni:
Létrehozzuk a névteret:
CodeNamespace sample = new CodeNamespace(textBox1.Text);
sample.Imports.Add(new CodeNamespaceImport("System"));
Létrehozzuk az osztályt, ahogyan a korábbi példákban is tettük:
CodeTypeDeclaration c = new CodeTypeDeclaration(textBox2.Text);
c.IsClass = true;
sample.Types.Add(c);
Az osztály konstruktorának létrehozása a következő lépés.
CodeConstructor constructor = new CodeConstructor();
A konstruktor kódjában létrehozunk két változót, melyek a paramétereket fogják tartalmazni.
constructor.Statements.Add(new CodeSnippetStatement("int op1 = 0;"));
constructor.Statements.Add(new CodeSnippetStatement("int op2 = 0;"));
A kapott paramétereket Int32 típusúra konvertáljuk. Amennyiben a kapott értékek valamelyike nem szám, akkor egy hibaüzenetet jelenítünk meg a konzol kimenetén, majd a programot leállítjuk. Ennek érdekében beépítünk egy TRY-CATCH párt a kódba.
constructor.Statements.Add(new CodeSnippetStatement("try{"));
constructor.Statements.Add(new CodeSnippetStatement("op1 = Convert.ToInt32(param1);"));
constructor.Statements.Add(new CodeSnippetStatement("op2 = Convert.ToInt32(param2);"));
constructor.Statements.Add(new CodeSnippetStatement("}catch{Console.WriteLine(\"...\");Console.ReadLine();return;}"));
A kapott egész számokat összeadjuk, majd az eredményt egy karakterláncba helyezzük.
constructor.Statements.Add(new CodeSnippetStatement("int result = op1 + op2;"));
constructor.Statements.Add(new CodeSnippetStatement("string str = op1.ToString() + \" + \" + op2.ToString() + \" = \" + result.ToString();"));
A karakterlánc megjelenítéséhez létrehozunk egy, a Console.WriteLine metódust reprezentáló objektumot.
CodeMethodInvokeExpression writer = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), "WriteLine", new CodeSnippetExpression("str"));
Majd a konstruktor utasításlistájához adjuk:
constructor.Statements.Add(writer);
A konstruktor paramétereit egy-egy CodeParameterDeclarationExpression objektum képezi. A paraméterek neve param1, és param2, típusuk string.
CodeParameterDeclarationExpression constparam1 = new CodeParameterDeclarationExpression(System.Type.GetType("System.String"),"param1");
CodeParameterDeclarationExpression constparam2 = new CodeParameterDeclarationExpression(System.Type.GetType("System.String"),"param2");
Ezeket a konstruktor objektum Parameters listájában kell elhelyeznünk.
constructor.Parameters.Add(constparam1);
constructor.Parameters.Add(constparam2);
Annak érdekében, hogy a MAIN metódus paramétert kaphasson, egyszerű tagmetódusként hozzuk létre.
CodeMemberMethod main = new CodeMemberMethod();
main.Name = "Main";
main.ReturnType = new CodeTypeReference(typeof(void));
Megkapja a STATIC jellemzőt.
main.Attributes = MemberAttributes.Static;
A paramétere egy karakterlánc tömb lesz, melynek szintén egy paraméterobjektumot kell deklarálnunk:
CodeParameterDeclarationExpression mainparam = new CodeParameterDeclarationExpression("System.String[]","args");
Majd a metódushoz adjuk:
main.Parameters.Add(mainparam);
A Main metódusban egy műveletet végzünk el, példányosítjuk a létrehozott osztályunkat, a konstruktorba paraméterként átadva a karakterlánc-tömb két elemét.
main.Statements.Add(new CodeSnippetStatement(textBox2.Text + " calc = new " + textBox2.Text + "(args[0],args[1]);"));
Természetesen minden metódust a szülőobjektum valamely kollekciójának részévé kell tenni, ezen utasítások azonban a cikk korábbi fejezeteihez képest nem változtak, így ezeket nem említjük.
A műveletek végén generáljuk az állományt.
generator.GenerateCodeFromNamespace(sample, tw, null);