• 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--破狼

  • 相关阅读:
    vc++ 最小化到托盘的详细实现
    WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)
    windows 进程间通讯方法
    C++中各种数据量类型转换
    WTL 自绘 进度条Progressbar
    C++ 读取XML文件(tinyXML库的应用)
    WTL 自定义 Button类-自绘
    设计模式课程 设计模式精讲 27-3 状态模式源码解析
    设计模式课程 设计模式精讲 27-2 状态模式coding
    设计模式课程 设计模式精讲 26-3 访问者模式源码解析
  • 原文地址:https://www.cnblogs.com/whitewolf/p/1771138.html
Copyright © 2020-2023  润新知