CodeDom系列四--Code生成

      我们利用CodeDom技术生成了一些列Codedom Expression ,接下来的任务就是编译和生成,生成c#、Vb或者是.NET平台支持语言,编译程序集(dll或者是exe)。

      CodeDomProvider:在2.0后提供了CodeDomProvider.CreateProvider(string language)的工厂类,取代以前的  
Microsoft.VisualBasic.VBCodeProvider、 Microsoft.CSharp.CSharpCodeProvider的创建CodeDomProvider的方式,现在我们可以仅用一句CodeDomProvider.CreateProvider("c#")方式就可以创建CSharpCodeProvider。

      有了CodeDomProvider我们就可以利用Provider生成对应语言的源代码:ICodeGenerator :代码生成抽象,可以用provider.CreateGenerator()取得;这个类给我提供了代码生成的方法有:

GenerateCodeFromCompileUnit:从编译单元生成code 
GenerateCodeFromExpression:从表达式生成code 
GenerateCodeFromMember:从类型成员Member生成code 
GenerateCodeFromNamespace:从命名空间生成code 
GenerateCodeFromStatement:从statement语句生成code 
GenerateCodeFromType:从类型Type生成code。

其实在CodeDomProvider也通过了同样的方法,个人习惯于用CodeDomProvider的方法。

他们都有个共同的参数就是生成参数:CodeGeneratorOptions。在CodeGeneratorOptions里提供了code生成时的选项BlankLinesBetweenMembers:获取或设置一个值,该值指示是否在成员之间插入空行。 
BracingStyle:获取或设置用于大括号的样式。此属性的默认值为 Block,该值指示在生成代码时,使大括号从关联的语句或声明所在的行开始。C 属性值指示大括号从关联的语句或声明的后面一行开始。 
ElseOnClosing:获取或设置一个值,该值指示是否在前面每个 if 或 try 块的结束行处追加 else、catch 或 finally 块(包括括号)。 
IndentString:获取或设置用于缩进的字符串。 
Item:获取或设置指定索引处的对象。 
VerbatimOrder:获取或设置一个值,该值指示是否按成员在成员集合中出现的顺序生成成员。

还有就是System.IO.TextWriter的参数,这个参数我们可以通过输出File文件的StreamWrite或者是StringBuilder的StringWrite。故名思意,其输出的方式和位置不同。

例如:

CodeGeneratorOptions geneOptions = new CodeGeneratorOptions();//代码生成选项

            geneOptions.BlankLinesBetweenMembers = false;

            geneOptions.BracingStyle = "C"; // C风格

            geneOptions.ElseOnClosing = true;

            geneOptions.IndentString = "    ";

这里代码生成的全部就完成了,我们来一个简单的担待生成Demo:功能就是输出一句话: 
System.Console.WriteLine("Tes tCodeDom Generate!")

  public static void TestCodeDomGenerate()
        {
            //CodeGeneratorOptions
             CodeGeneratorOptions geneOptions = new CodeGeneratorOptions();//代码生成选项

            geneOptions.BlankLinesBetweenMembers = false;

            geneOptions.BracingStyle = "C";

            geneOptions.ElseOnClosing = true;

            geneOptions.IndentString = "    ";

            //TextWrite
            StringBuilder sb=new StringBuilder();
            System.IO.StringWriter sw=new System.IO.StringWriter(sb);

            CodeMethodInvokeExpression mehtodinvoke = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("System.Console"), 
"WriteLine",
                new CodePrimitiveExpression("Tes tCodeDom Generate!"));
            CodeDomProvider.CreateProvider("c#").GenerateCodeFromExpression(mehtodinvoke,sw,geneOptions);
            sw.Close();
            Console.WriteLine(sb.ToString());

        }

运行结果:

 

 

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2010/07/05/1771138.html

时间: 2024-09-11 04:52:49

CodeDom系列四--Code生成的相关文章

CodeDom系列目录

      CodeDOM 提供了表示许多常见的源代码元素类型的类型.您可以设计一个生成源代码模型的程序,使用 CodeDOM 元素  构成一个对象图.可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码.CodeDOM 也可以用于将  源代码编译成二进制程序集. CodeDOM 的一些一般用途包括: 模板化代码生成:生成 ASP.NET.XML Web 服务客户端代理.代码向导.设计器或其他代码发出机制的代码. 动态编译:支持以一种或多种语言进行代码编译. 经过连续几

BootStrap智能表单实战系列(四)表单布局介绍_javascript技巧

什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 表单的布局分为自动布局和自定义布局两种: 自动布局就是根据配置项中第二级配置项中数组的长度来自动使用不同的bootstrap栅格,通过设置autoLayout为true可以实现自动布局 自动以布局就是根据autoLayout来决定使用的栅格,通过设置autoLayout:'1,2,1,2,2,4' 表示 第一.二列占3格

走近Flex组件系列(四):分组组件(Box)、分割组件(DividedBox)和容器组件

走近Flex组件系列(四):分组组件(Box).分割组件(DividedBox)和容器组件(Panel) 本文主要介绍Flex的Box,DividedBox和Panel组件的应用. 一.分组组件(Box) Flex中Box组件分两种,即VBox和HBox,也就是水平分组布局和垂直分组布局.下面对这两中分别进行介绍. Flex的VBox组件可以自动的帮助开发人员在界面布局的时候进行水平分组,所谓的分组也就是他会自动将放置在其内部的其他组件进行水平布局放置,如下mxml代码: 1 <mx:HBox

iOS开发UINavigation系列四——导航控制器UINavigationController

iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言         在前面的博客中,我么你介绍了UINavigationBar,UINavigationItem和UIToolBar,UINavigationController是将这些控件和UIViewController紧密的结合了起来,使用导航,我们的应用程序层次会更加分明,对controller的管理也更加方便.前几篇博客地址如下: UINavigationBar:http://my

iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局

iOS流布局UICollectionView系列四--自定义FlowLayout进行瀑布流布局 一.引言         前几篇博客从UICollectionView的基础应用到设置UICollectionViewFlowLayout更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下: 这种布局无疑在app的应用中更加广泛,商品的展示,书架书目的展示,都会倾向于采用这样的布局方式,当然,通过

xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1285460 xen虚拟化实战系列文章列表 xen虚拟化实战系列(一)之xen虚拟化环境安装xen虚拟化实战系列(二)之xen虚拟机安装xen虚拟化实战系列(三)之xen虚拟机复制xen虚拟化实战系列(四)之xen虚拟机扩展磁盘空间一法xen虚拟化实战系列(五)之xen虚拟机扩展磁盘空间再一法xen虚拟化实战系列(六)之x

iOS中CoreData数据管理系列四——进行数据与页面的绑定

iOS中CoreData数据管理系列四--进行数据与页面的绑定 一.引言     在上一篇博客中,我们讨论了CoreData框架中添加与查询数据的操作,事实上,在大多数情况下,这些数据都是由一个UITableView表视图进行展示的,因此,CoreData框架中还未开发者提供了一个类NSFetchedResultsController,这个类作为桥接,将视图与数据进行绑定. 添加与查询数据操作:http://my.oschina.net/u/2340880/blog/611430. 二.进行数据

使用PHP QR Code生成二维码

HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.sourceforge.net/ 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本:参数$outfile表示是否输出二维码图片 文件,默认否:参数$level表示容错率,也就是

VSTO之旅系列(四):创建Word解决方案

原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结   一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个专题中,我将为大家介绍如何用VSTO来创建Word项目,对于Word的VSTO开发和Excel的开发很类似,你同样也可以为Word自定义界面的,他们的区别主要在于对象模型的不同,只要熟悉了Word的对象模型,操作Word也就很简单了.下面首先就开始介绍Word的对象模型的. 二.Word对象模型