經常被朋友問到如何動態產生代碼。這個功能是由.NET Framework內建支援的。下面這個方法就是一個簡單的例子
private void GenerateCode() {
/*注意,先匯入下面的命名空間
using System.CodeDom
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
*/
//準備一個代碼編譯器單元
CodeCompileUnit unit = new CodeCompileUnit();
//準備必要的命名空間(這個是指要產生的類的空間)
CodeNamespace sampleNamespace=new CodeNamespace("Xizhang.com");
//匯入必要的命名空間
sampleNamespace.Imports.Add(new CodeNamespaceImport("System"));
//準備要產生的類的定義
CodeTypeDeclaration Customerclass = new CodeTypeDeclaration("Customer");
//指定這是一個Class
Customerclass.IsClass = true;
Customerclass.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
//把這個類放在這個命名空間下
sampleNamespace.Types.Add(Customerclass);
//把該命名空間加入到編譯器單元的命名空間集合中
unit.Namespaces.Add(sampleNamespace);
//這是輸出檔案
string outputFile = "Customer.cs";
//添加欄位
CodeMemberField field = new CodeMemberField(typeof(System.String), "_Id");
field.Attributes = MemberAttributes.Private;
Customerclass.Members.Add(field);
//添加屬性
CodeMemberProperty property = new CodeMemberProperty();
property.Attributes = MemberAttributes.Public | MemberAttributes.Final;
property.Name = "Id";
property.HasGet = true;
property.HasSet = true;
property.Type = new CodeTypeReference(typeof(System.String));
property.Comments.Add(new CodeCommentStatement("這是Id屬性"));
property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_Id")));
property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_Id"), new CodePropertySetValueReferenceExpression()));
Customerclass.Members.Add(property);
//添加方法(使用CodeMemberMethod)--此處略
//添加構造器(使用CodeConstructor) --此處略
//添加程式進入點(使用CodeEntryPointMethod) --此處略
//添加事件(使用CodeMemberEvent) --此處略
//添加特徵(使用 CodeAttributeDeclaration)
Customerclass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializableAttribute))));
//產生代碼
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CodeGeneratorOptions options = new CodeGeneratorOptions();
options.BracingStyle = "C";
options.BlankLinesBetweenMembers = true;
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputFile)) {
provider.GenerateCodeFromCompileUnit(unit, sw, options);
}
}
最後產生的結果是