在微软的自家代码生成方案中我们有两种选择方式:CodeDom 和Text Template Transformation Toolkit(T4)模板。同样我们可以利用简单的String或者StringBuilder来拼接字符串,但是那对于简单的还可以,但是对于复杂的问题就。其实在ASP.NET MVC 3.0中有多处了一个更简洁语法的模板-Razor,我们同样可以运用于我们自己的代码生成中,我随便有一篇简单的介绍Razor Templating Engine,在以后有机会了会写Razor Demo。今天的主题不在这里,所以不多说了。

一:简介:

CodeDom:这 个类库出现在我们的.NET Framework 2.0,并且被深深的用于我们的ASP.NET项目中。CodeDom关注于一个语言独立性,以至于我们可以利用我们熟悉的语言(c#,vb等)构建一个CodeDom Model Tree,就可以生成我们在.NET平台所支持的语言代码。对于我们的ASP.NET要求语言的独立。

T4:T4模板作为VS2008的一部分出现,他以<# #> 、<#= #>接近于ASP.NET的语言在模板中插入一段段的动态代码块,可以像asp或者ASP.NET一样简单的更让人贴切,相对于CodeDom就更简洁,但是没有了语言层次的抽象,不具有语言独立性,我们必须为同一个功能的模板在不同的语言上写不同的模板,但是在开发中往往c#模板就足够了,以及更简单化所以得到了更多人的青睐。

二:Code Demo:

下面我们将用CodeDom和t4分别生成一个简单的Code,根据时间输出不同的问候,如下:

1:CodeDom Code:

using System; 
using System.Text; 
using System.CodeDom; 
using System.IO;

namespace RazorDemo 

    public class CodedomDemo 
    { 
        public CodeCompileUnit CrateCodeCompileUnit() 
        { 
            var testClass = new CodeTypeDeclaration("Test"); 
            var testMeth = new CodeMemberMethod() 
            { 
                Attributes = MemberAttributes.Public| MemberAttributes.Final, 
                Name = "SayHello", 
            }; 
            var param = new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "name"); 
            testMeth.Parameters.Add(param); 
            testClass.Members.Add(testMeth);

var nowExpression = new CodePropertyReferenceExpression(new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(typeof(DateTime)), "Now"), "Hour"); 
            var assmon = new CodeBinaryOperatorExpression(new CodePrimitiveExpression("早上好:"), CodeBinaryOperatorType.Add, new CodeArgumentReferenceExpression("name") ); 
            var asslunch = new CodeBinaryOperatorExpression(new CodePrimitiveExpression("中午好:"), CodeBinaryOperatorType.Add, new CodeArgumentReferenceExpression("name")); 
            var assAfternoon = new CodeBinaryOperatorExpression(new CodePrimitiveExpression("下午好:"), CodeBinaryOperatorType.Add, new CodeArgumentReferenceExpression("name")); 
            var codecondition = new CodeConditionStatement(new CodeBinaryOperatorExpression( 
                nowExpression, CodeBinaryOperatorType.LessThanOrEqual, new CodePrimitiveExpression(10)), 
                new CodeStatement[] { new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Console)), "WriteLine", assmon)) },           //true:if(DateTime.Now<=10) 
                //else 
                new CodeStatement[] 
                { 
                   new CodeConditionStatement(new CodeBinaryOperatorExpression(nowExpression, CodeBinaryOperatorType.LessThanOrEqual,new CodePrimitiveExpression(14) ),  // else if(DateTime.Now<=14) 
                     new CodeStatement[] { new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Console)), "WriteLine",asslunch))},    //true 
                     new CodeStatement[] { new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Console)), "WriteLine",assAfternoon))}) //fasle 
                } 
               );

testMeth.Statements.AddRange(new CodeStatement[] {             
            codecondition 
            });

var ns = new CodeNamespace("Wolf"); 
            ns.Imports.Add(new CodeNamespaceImport("System")); 
            ns.Types.Add(testClass); 
            var util = new CodeCompileUnit(); 
            util.Namespaces.Add(ns); 
            return util; 
        }

public string Genertor(string language) 
        { 
            StringBuilder sb = new StringBuilder(); 
            StringWriter sw = new StringWriter(sb); 
            System.CodeDom.Compiler.CodeDomProvider.CreateProvider(language).GenerateCodeFromCompileUnit( 
                this.CrateCodeCompileUnit(), sw, new System.CodeDom.Compiler.CodeGeneratorOptions() 
                { 
                    ElseOnClosing = true, 
                    IndentString = "    " 
                }); 
            sw.Close(); 
            return sb.ToString();


    } 
}

2:T4 Code:

<#@ template language="C#" #>

using System; 
namespace WolfT4 {   
    public class Test {

public void SayHello(string name) { 
            <# if(System.DateTime.Now.Hour<=10){#> 
            System.Console.WriteLine(("早上好:" + name)); 
            <#} else if(System.DateTime.Now.Hour<=14){#> 
            System.Console.WriteLine(("中午好:" + name)); 
            <#} else{ #> 
            System.Console.WriteLine(("下午好:" + name)); 
            <#}#>            
        } 
    } 
}

三:总结:

CodeDom的优势:

1:具有语言层次抽象,独立性:是一个单语言开发,多语言生成的方式。

2:Framework 的支持:作为我们的.NET Framework 一部分出现的,位于System.CodeDom命名空间下。不需要想T4 模板一样引用Microsoft.VisualStudio.TextTemplating.dll

T4优势:

1:更加贴切:采用的是类似于ASP、ASP.NET的语言块,是的我们的开发更贴切,采用模板方式更加简洁,快速。

2:可维护性:由于是基于文件,不像codedom编译成为dll方式,我们可以随时修改Template文件、重构。

其实我觉得只要是不要求语言独立性,多语言生成的话,就采用T4或者Razor等模板。

代码生成技术(目前完成,还在继续,好久没写了...):

1:CodeDom系列目录

2:CodeSmith模板引擎系列-目录

3:Razor Templating Engine

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

代码生成技术--CodeDom VS T4相关推荐

  1. 编译优化 | LLVM代码生成技术详解及在数据库中的应用

    简介:作者:长别 1. 前言 随着IT基础设施的发展,现代的数据处理系统需要处理更多的数据.支持更为复杂的算法.数据量的增长和算法的复杂化,为数据分析系统带来了严峻的性能挑战.近年来,我们可以在数据库 ...

  2. Elixir元编程-第三章 编译时代码生成技术进阶

    Elixir元编程-第三章 编译时代码生成技术进阶 注:本章内容来自 Metaprogramming Elixir 一书,写的非常好,强烈推荐.内容不是原文照翻,部分文字采取意译,主要内容都基本保留, ...

  3. 中国@代码生成技术@国产

    第一节: 大家好: 我们今天讲的还是代码生成,我们知道的有codedom是微软生成自己框架代码的一个类,可以说是自己生成 自己了.不过我说的生成是根据一定的规则来生成一定的代码.   我们的DotNe ...

  4. 基于动态代码生成技术的动态对象工厂

    C#中所有的引用类型的实例都需要在运行时动态创建,创建对象实例最常见的办法就是使用new操作符,使用new操作符就需要在编译器明确的知道要创建的对象的类型,如果在编译器并不能明确,就需要用到反射技术, ...

  5. 一起谈.NET技术,编写T4模板无法避免的两个话题:quot;Assembly Lockingquot;amp;quot;Debugquot;...

    在这之前,我写了一系列关于代码生成和T4相关的文章,而我现在也试图将T4引入我们自己的开发框架.在实践中遇到了一些问题,也解决了不少问题.如果你也在进行T4相关的开发,相信你也一定会遇到这些问题.为此 ...

  6. 从零开始写一个抖音App——Apt代码生成技术、gradle插件开发与protocol协议

    1.讨论--总结前两周评论中有意义的讨论并给予我的解答 2.mvps代码生成原理--将上周的 mvps 架构的代码生成原理进行解析 3.开发一款gradle插件--从 mvps 的代码引出 gradl ...

  7. 基于 Eclipse 平台的代码生成技术

    Eclipse 的 Java Emitter Templates(JET)一个开源的模板引擎,其功能是在 Eclipse Modeling Framework(EMF)中生成代码. JET 技术介绍 ...

  8. simulink仿真及代码生成技术入门到精通_行星排混动从入门到精通(结构)

    ​希望关注本专栏的朋友,也能一并关注微信公众号. ​原文地址:行星排混动从入门到精通(结构) 行星齿轮机构结构在我们的行业生产中有着广泛的运用.如:AT变速箱(带变矩器的那种).电机减速器.后桥差速器 ...

  9. simulink仿真及代码生成技术入门到精通_Simulink仿真零基础入门到精通实用教学教程 自学全套...

    Simulink仿真零基础入门到精通实用教学教程 自学全套,以教程文字为主,毕业论文和报告均可以借鉴. Simulink是电气工程必学的模型仿真专业工具软件,非常的实用.小编在全网中搜索都没有找到非常 ...

最新文章

  1. 事件冒泡和阻止事件冒泡
  2. [九度][何海涛] 数组中出现次数超过一半的数字
  3. pycharm安装scrapy失败_运行Scrapy程序时出现No module named win32api问题的解决思路和方法...
  4. jQuery中this与$(this)区别
  5. 前端学习(2820):全局文件tabber字段
  6. [转载] JAVA泛型杂谈--擦除,协变,逆变,通配符等
  7. Intel处理器CPUID指令学习
  8. SharePoint专家新闻轮转器WebPart----亲測力推之Web部件
  9. Shiro 的 HelloWorld
  10. 在linux系统下安装与配置SVN服务器
  11. 大数据时代,数据的应用场景
  12. 机器学习实战之信用卡诈骗(一)
  13. 【转】免费进入学术数据库
  14. android 快速关闭键盘的方法,安卓永久关闭键盘灯的方法
  15. 网管的自我修养-人际关系
  16. 互联网广告学——程序化购买
  17. LMMSE信道估计算法如何求自相关矩阵
  18. 【iMessage苹果相册推位置推】 去向证书发送到 App Store 本子, 可以使用同一个出站证书,这样可以测试你的ME环境出站工艺流程是不是有题目题目。
  19. 蜘蛛池刷百度指数和第三方贴
  20. i7 1255u怎么样?相当于什么水平

热门文章

  1. 计算机设备管理程序在哪,电脑设备管理在哪,教您如何打开电脑设备管理
  2. 外卖匹配系统_“外卖智能算法”和大学生有啥关系?来自工科生的专业分析
  3. CA AutoSys Workload Automation r11 Quick Resource Guide
  4. java 读取oracle的blob/clob
  5. ASP.NET 4 和 Visual Studio 2010 Web 开发概述
  6. 关于缓存雪崩\穿透\击穿等一些问题
  7. grep 匹配制表符 和 换行符
  8. Python3 数据库操作小封装
  9. UVa 1609 (博弈) Foul Play
  10. 面向Java应用的快速Web服务支持工具 - Netrifex