多年前用過李天平前輩的,自己改過,后來李老師做動軟了,不給源碼,修改不是很方便。加上我目前需要轉java方向,于是決定自己搞。到目前為止花了整整一個星期了,看看目前的成果。
最后是代碼工程文件,用c#開發的,IDE是vs2010
為了實現最大的模板自由,設計了專有的模板語法?;贑#,但是已經做到盡量簡化,對有一點開發經驗的同行應該是很好上手的。
目前c#的代碼模板已經做了一些通用樣例,接下來做java的開發代碼模板。
總之,為了提高效率,并且規范項目團隊成員的代碼書寫。
下面把核心的代碼兩個類文件貼出來,分別是動態編譯和模板解析
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.CodeDom.Compiler; 6 using System.Reflection; 7 8 namespace CodeMaker.Engine 9 { 10 public class Compiler 11 { 12 /// <summary> 13 /// 普通代碼編譯執行出字符串 14 /// </summary> 15 /// <param name="strCode"></param> 16 /// <returns></returns> 17 public static string DoCompile(string strCode) 18 { 19 20 StringBuilder strResults = new StringBuilder(); 21 22 CodeDomPRovider provider = CodeDomProvider.CreateProvider("CSharp"); 23 24 //CompilerParameters 編譯參數 25 CompilerParameters objCompilerParameters = new CompilerParameters(); 26 objCompilerParameters.ReferencedAssemblies.Add("System.dll"); 27 objCompilerParameters.ReferencedAssemblies.Add("System.Core.dll"); 28 objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll"); 29 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.BLL.dll"); 30 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.DALFactory.dll"); 31 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.IDAL.dll"); 32 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.Model.dll"); 33 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.MySqlDAL.dll"); 34 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.SqlDAL.dll"); 35 objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.Engine.dll"); 36 objCompilerParameters.GenerateExecutable = false; 37 objCompilerParameters.GenerateInMemory = true; 38 39 // CompilerResults 40 CompilerResults cr = provider.CompileAssemblyFromSource(objCompilerParameters, strCode); 41 42 if (cr.Errors.HasErrors) 43 { 44 Console.WriteLine("編譯錯誤:"); 45 foreach (CompilerError err in cr.Errors) 46 { 47 strResults.Append(err.ErrorText); 48 strResults.Append(Environment.NewLine); 49 strResults.Append(err.Line); 50 strResults.Append(Environment.NewLine); 51 strResults.Append(err.ToString()); 52 strResults.Append(Environment.NewLine); 53 54 } 55 } 56 else 57 { 58 // 通過反射,調用OutPut的輸出方法 59 Assembly objAssembly = cr.CompiledAssembly; 60 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.CodeGenerate"); 61 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut"); 62 63 strResults.Append(objMI.Invoke(objHelloWorld, null)); 64 strResults.Append(Environment.NewLine); 65 66 } 67 68 69 return strResults.ToString(); 70 } 71 72 public static string DoCodeMakerCompile(string strDBType,string DALAssemblyPath, string strDataBase,string strTableName, string strEntityName,string strCode) 73 { 74 75 76 StringBuilder sb = new StringBuilder(); 77 //加上要編譯部分代碼的頭部和尾部 78 //頭部 79 sb.Append("using System;"); 80 sb.Append("using System.Data;"); 81 sb.Append("using System.Text;"); 82 sb.Append("using System.Linq;"); 83 sb.Append("using System.Globalization;"); 84 sb.Append("using System.Collections.Generic;"); 85 sb.Append("using CodeMaker.Model;"); 86 sb.Append("using CodeMaker.BLL;"); 87 sb.Append("using CodeMaker.Engine;"); 88 sb.Append("namespace DynamicCodeGenerate"); 89 sb.Append("{"); 90 91 92 93 sb.Append(" public class CodeGenerate"); 94 sb.Append(" {"); 95 sb.Append(" public string OutPut()"); 96 sb.Append(" {"); 97 98 //讀取數據實體的屬性的代碼段 99 sb.Append(GetEntity(strDBType, DALAssemblyPath, strDataBase, strTableName, strEntityName));100 101 sb.Append(strCode);102 103 //返回值,字符串104 sb.Append(" return s.ToString(); ");105 sb.Append(" }");106 //fOutPut方法結束107 //首字母大寫方法108 sb.Append(" public string ToTitleCase(string str)");109 sb.Append(" {");110 sb.Append(" return str.Substring(0,1).ToUpper()+str.Substring(1);");111 sb.Append(" }");112 //首字母小寫方法113 sb.Append(" public string ToLowerCase(string str)");114 sb.Append(" {");115 sb.Append(" return str.Substring(0,1).ToLower()+str.Substring(1);");116 sb.Append(" }");117 118 sb.Append(" }");119 sb.Append("}");120 121 return DoCompile(sb.ToString());122 }123 124 private static string GetEntity(string strDBType, string DALAssemblyPath, string strDataBase, string strTableName, string strEntityName)125 {126 StringBuilder sb = new StringBuilder();127 sb.Append("CodeMaker.BLL.EntityBLL bll = new CodeMaker.BLL.EntityBLL(/"" + DALAssemblyPath + "/");");128 sb.Append("IList<CodeMaker.Model.Entity> es = bll.GetEntityList(/"" + strDataBase + "/", /"" + strTableName + "/");");129 sb.Append("string EntityName=/"" + strEntityName + "/";");//實體名,供模板中的代碼段使用130 sb.Append("
新聞熱點
疑難解答