您的位置:首页 > 编程语言 > C#

如何用C#动态生成代码

2009-06-12 00:43 357 查看
该篇文章是我于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); } } 最后生成的结果是



作者:陈希章

出处:http://blog.csdn.net/chen_xizhang

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: