如何用C#动态生成代码

来源:互联网 发布:网络推广部门组建方案 编辑:程序博客网 时间:2024/04/30 03:08
该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/07/09/1238572.html
原文标题:如何用C#动态生成代码
原文发表:2008/7/8 22:09:00

经常被朋友问到如何动态生成代码。这个功能是由.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);

}

}

最后生成的结果是

image

作者:陈希章
出处:http://blog.csdn.net/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。