博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeDom系列四--Code生成
阅读量:5925 次
发布时间:2019-06-19

本文共 2513 字,大约阅读时间需要 8 分钟。

      我们利用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生成时的选项:获取或设置一个值,该值指示是否在成员之间插入空行。 

:获取或设置用于大括号的样式。此属性的默认值为 Block,该值指示在生成代码时,使大括号从关联的语句或声明所在的行开始。C 属性值指示大括号从关联的语句或声明的后面一行开始。 
:获取或设置一个值,该值指示是否在前面每个 if 或 try 块的结束行处追加 else、catch 或 finally 块(包括括号)。 
:获取或设置用于缩进的字符串。 
:获取或设置指定索引处的对象。 
:获取或设置一个值,该值指示是否按成员在成员集合中出现的顺序生成成员。

还有就是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/archive/2010/07/05/1771138.html,如需转载请自行联系原作者

你可能感兴趣的文章
android笔记之在WebView中显示ProgressBar的两种方法
查看>>
Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)
查看>>
如何关闭Struts2的webconsole.html
查看>>
简单获取任意app的URL Schemes
查看>>
Jenkins修改管理员密码.
查看>>
番茄工作法—《可以量化的管理学》
查看>>
GDB 配置
查看>>
Spring Cloud Gateway 原生支持接口限流该怎么玩
查看>>
数据结构笔记--栈的总结及java数组实现简单栈结构
查看>>
用python来更改小伙伴的windows开机密码,不给10块不给开机
查看>>
2016 China Joy抢先看,文末有彩蛋!
查看>>
阿里云如何实现海量短视频的极速分发?答案在这里!
查看>>
Ubuntu系统备份工具大全(官方整理推荐)
查看>>
海尔联手软银机器人,进军服务机器人领域
查看>>
基于scikit-learn机器学习库的分类预测
查看>>
Ubuntu 16.04安装Chrome浏览器
查看>>
bugly中批量隐藏版本
查看>>
如何管理跨部门的沟通与协作?
查看>>
亿方云CEO程远:转型第一式:链接企业人与数据
查看>>
基于Redis的MQ中间件实现-目录
查看>>