当前位置: 首页 > news >正文

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());
            
        }

运行结果:

image 



本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2010/07/05/1771138.html,如需转载请自行联系原作者

相关文章:

  • X 1 BT5kali
  • TCP协议中的三次握手和四次挥手(图解)【转】
  • 转载:年轻人,你着什么急?
  • 例25:二分查找
  • 常识性概念
  • 如何做出健壮的系统设计
  • Docker Registry服务器部署配置
  • C++类、继承、多态、虚函数
  • ZOJ 3329 One Person Game
  • pyinstall tkinter image
  • CSS快速入门
  • 强力优化Rancher k8s中国区的使用体验
  • Windows 8 Platform (三) Windows 8 Developer Preview
  • 关于责任和业务(r11笔记第60天)
  • 如何测试网页登录
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译] 怎样写一个基础的编译器
  • 0x05 Python数据分析,Anaconda八斩刀
  • ERLANG 网工修炼笔记 ---- UDP
  • HTML中设置input等文本框为不可操作
  • Invalidate和postInvalidate的区别
  • javascript数组去重/查找/插入/删除
  • leetcode386. Lexicographical Numbers
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • React-Native - 收藏集 - 掘金
  • vue的全局变量和全局拦截请求器
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 算法-图和图算法
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 无服务器化是企业 IT 架构的未来吗?
  • 《码出高效》学习笔记与书中错误记录
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #define,static,const,三种常量的区别
  • (10)ATF MMU转换表
  • (Java)【深基9.例1】选举学生会
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (NSDate) 时间 (time )比较
  • (Python) SOAP Web Service (HTTP POST)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (WSI分类)WSI分类文献小综述 2024
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (过滤器)Filter和(监听器)listener
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)scrum常见工具列表
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .gitignore文件设置了忽略但不生效
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net 高效开发之不可错过的实用工具
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET开发者必备的11款免费工具
  • .NET是什么