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

相关文章
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
237 0
|
Java 应用服务中间件 微服务
信创迁移适配实战-SpringBoot项目打包war部署至TongWeb7
信创迁移适配实战-SpringBoot项目打包war部署至TongWeb7
4224 0
信创迁移适配实战-SpringBoot项目打包war部署至TongWeb7
|
7月前
|
人工智能 安全 Anolis
打造更 AI 的操作系统 《龙蜥+超级探访》第三期走进浪潮信息
且看龙蜥社区如何联合浪潮信息向更高层次的操作系统智能化迈进?
打造更 AI 的操作系统 《龙蜥+超级探访》第三期走进浪潮信息
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
深度解析Recraft V3:突破文本渲染限制,文生图黑马是怎样炼成的?
Recraft V3模型在文本生成图像(Text-to-Image)领域取得重大突破,通过创新的"Bridging Text Spotting"方法,解决了传统方法中误差累积和性能不佳的问题。该模型采用独立训练的检测器和识别器,并引入Bridge和Adapter机制,确保高质量图像生成。Recraft V3在多个数据集上表现优异,如Total-Text准确率达83.3%,ICDAR 2015达89.5%。其应用前景广泛,涵盖广告设计、教育和娱乐等领域,为文生图技术的实际应用提供了新可能。
383 27
|
11月前
|
网络安全 数据安全/隐私保护 C++
VS Code 的SSH连接不成功问题分析与解决
VS Code 的SSH连接不成功问题分析与解决
|
中间件 Java Nacos
测试中间件 - Nacos 快速入门(一)
测试中间件 - Nacos 快速入门(一)
416 73
测试中间件 - Nacos 快速入门(一)
|
消息中间件 Java Apache
使用Spring Boot实现与ActiveMQ的消息队列集成
使用Spring Boot实现与ActiveMQ的消息队列集成
|
SQL 存储 前端开发
Python后端技术栈(七)--web框架
Python后端技术栈(七)--web框架
|
JSON 缓存 Java
企业微信开发OA审批
企业微信开发OA审批
750 0