博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeSmith模板引擎系列一
阅读量:7038 次
发布时间:2019-06-28

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

     在前些日子写了一些关于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、业务对象、表示层代码或任何其它基于数据库概要信息的代码。(来自:)

      我们今天先来看看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程序集输出数据库表信息:

 

ExpandedBlockStart.gif
代码
<%
@ 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文件结果为:

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

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

你可能感兴趣的文章
Note 741478 - FAQ: Materialized views
查看>>
Everything(文件搜索神器)
查看>>
KVC在定义Model类中的妙用
查看>>
笔试题目-J2EE
查看>>
jdk分析工具:jps和jstack
查看>>
如何将java源码打成jar包
查看>>
参加Tech.ED2008(微软技术大会)上海站
查看>>
NPM版本号
查看>>
[Android] 判断手机上是否安装了某个程序
查看>>
安装OpenLDAP步骤
查看>>
自我激励的20种方法
查看>>
Netbeans 8.2将支持PHP 7
查看>>
Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis
查看>>
DotNetCore跨平台~linux上还原自主nuget包需要注意的问题
查看>>
《深入理解Nginx:模块开发与架构解析》一2.4 用HTTP核心模块配置一个静态Web服务器...
查看>>
Spotify投资方:与其上市 不如卖给Facebook吧
查看>>
EMC股东98%赞成票 果断批准戴尔并购案
查看>>
简单入门循环神经网络RNN:时间序列数据的首选神经网络
查看>>
告别盲目跟风 从事智能家居需具备哪些条件?
查看>>
荷兰电信公司Altice拟3.08亿美元收购广告科技公司Teads
查看>>