CodeSmith模板引擎系列一

简介:

     在前些日子写了一些关于CodeDom的代码生成技术(目录),这里先感谢大家的支持和关注。我打算写一些代码生成编译技术的系列,包括CodeDom、CodeSmith模板、T4模板、StringTemplate,以及Expression Tree的系列随笔。如果可能的话再加上Emit系列。在这些系列中希望大家多关注,特别多多指教和交流。好了废话少说,今天就开始写CodeSmith模板。

     CodeSmith是一个基于模板的代码生成器,它可以生成任何基于ASCII的编程语言代码。生成的代码可以使用属性进行定制。属性可以是任何具有设计器的.NET对象(大多数.NET内置类型已经有设计器),也可以是一个允许你从结果中有条件地添加或移除代码的简单的boolean 属性,或是一个对象,例如能够访问数据库表信息的TableSchema对象(包括在SchemaExplorer中)。CodeSmith完全可扩展,它允许用户创建定制属性类型。CodeSmith中包括多个定制属性类型的例子,例如,定制一个允许选择XML文件(使用XmlSerializer可将其反序列化到对象中)的属性类型。CodeSmith还允许用户在模板中引用和调用指定的外部程序集并且允许从外部程序集的类生成模板。

CodeSmith的语法与ASP.NET几乎相同。因此如果你熟悉ASP.NET ,那么应该会很快理解模板语法。你可以在模板中使用C#、VB.NET或JScript.NET语言,并且模板可以输出任何基于ASCII的语言。CodeSmith还包括一个名为SchemaExplorer的程序集,利用它可以访问几乎所有的数据库概要(schema)细节。访问这种信息让你能够生成各种代码,例如存储过程、类型DataSet、业务对象、表示层代码或任何其它基于数据库概要信息的代码。(来自:http://msdn.microsoft.com/msdnmag/issues/04/07/MustHaveTools/default.aspx

      我们今天先来看看CodeSmith的固定头信息:

<%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Description" %>

上面声明了语言为c#(也可以使其他语言)输出为Text非调试状态的模板 
<%@ Assembly Name="System.Data" %>

上面Wie引入程序集System.Data相当于我们项目的添加引用 
<%@ Import Namespace="System.Data" %>

导入命名空间System.Data相当于我们c#的using

<%@ Property Name="NameSpace" Type="String"  Category="Context"  Description="Description" %>

上面为申明字符串的属性NameSpace。这个将会在CodeSmith的Properties框里显示输出参数。

     今天就写一个简单的,毫无意义的模板,根据CodeSmith的SchemaExplorer程序集输出数据库表信息:

 

复制代码
代码
<% @ CodeTemplate Language = " C# "  TargetLanguage = " Text "  Src = ""  Inherits = ""  Debug = " False "   %>
<% @ Assembly Name = " SchemaExplorer "   %>
<% @ Import Namespace = " SchemaExplorer "   %>
<% Property  Name = " SourceTable "  Type = " SchemaExplorer.TableSchema "   Category = " Context "   %>
<% --    -----------------------------------------------------------------
 
--   Date  Created: 
 
--  Created By:   Generated by Wolf
 
------------------------------------------------------------------- %>
< html >
< head >
    
< title > CodeSmith Template </ title >     
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
 
< table  style ="background-color: #FFFFCC; display: table"     cellpadding ="0"  cellspacing ="0" >
            
< tr >
                
< th >
                    ColumnName
</ th >
                
< th >
                    DbType
</ th >
                
< th >
                    DataType
</ th >
                
< th >
                    Size
</ th >
                
< th >
                    IsPrimaryKey
</ th >
                
< th >
                    IsForeignKey
</ th >
                
< th >
                    Unique
</ th >
            
</ tr >
            
            
<%  foreach(ColumnSchema col in SourceTable.Columns ) { %>
            
< tr >
                
< td >
                    
<% =  col.Name  %> </ td >
                
< td >
                    
<% =  col.NativeType  %> </ td >
                
< td >
                    
<% =  col.DataType  %> </ td >
                
< td >
                   
<% =  col.Size  %> </ td >
                
< td >
                    
<% =  col.IsPrimaryKeyMember  %> </ td >
                
< td >
                    
<% =  col.IsForeignKeyMember  %> </ td >
                
                
< td >
                    
<% =  col.IsUnique  %> </ td >
            
</ tr >
            
<%  }  %>
        
</ table >
    
    
</ div >
    
</ form >
</ body >
</ html >
复制代码

  我们将输出导出为Html文件结果为:


 image 
今天就写到这里了,这个东西在我们的实际开发中毫无意义,只是拿来作为CodeSmith模板的HelloWorld示例,
请别拍砖。



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

目录
相关文章
|
5天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
8天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
448 93
|
1天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
286 2
|
7天前
|
SQL 人工智能 自然语言处理
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
随着生成式AI的普及,Geo优化(Generative Engine Optimization)已成为企业获客的新战场。然而,缺乏标准化流程(Geo优化sop)导致优化效果参差不齐。本文将深入探讨Geo专家于磊老师提出的“人性化Geo”优化体系,并展示Geo优化sop标准化如何帮助企业实现获客效率提升46%的惊人效果,为企业在AI时代构建稳定的流量护城河。
407 156
Geo优化SOP标准化:于磊老师的“人性化Geo”体系如何助力企业获客提效46%
|
7天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
314 158