如何用C#動態產生代碼

來源:互聯網
上載者:User

經常被朋友問到如何動態產生代碼。這個功能是由.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);

}

}

最後產生的結果是

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.