使用CodeSmith批量生成文件

  如果你能看到这篇文章,说明你手中已经有CodeSmith,如果没有,那去http://download.csdn.net/source/1452382这里下载吧。

  今天用了小一天的时间,了解了一下CodeSmith,确实是很强大,废话就不说了,批量生成文件的方法主要是调用子模板来生成文件。

  先看一下子模板:

代码
<%-- 
Name:
Author: 
Description: 
--%>
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Template description here." ResponseEncoding="UTF-8" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="Context" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
/////////////////////////////////////////////////////////////////////////////////////// 
// File: .cs 
// Description: Enter summary here after generation. 
// --------------------- 
// Copyright ? Our Client 
// --------------------- 
// History 
// <%= DateTime.Now.ToShortDateString() %> Original Version 
/////////////////////////////////////////////////////////////////////////////////////// 

using System;
namespace App.Entity
{
    
///<summary>
    
///<%=SourceTable.Columns[0].Description%>
    
///</summary>
    public class Entity<%=SourceTable.Name%> : BaseEntity
    {
        
<%foreach(ColumnSchema column in SourceTable.Columns)%>
        
<%{%>
        
///<summary>
        
///<%=column.Description%>
        
///</sumary>
        private <%=GetCSDataType(column)%> m_<%=column.Name%>;
        
<%}%>
        
        
<%foreach(ColumnSchema column in SourceTable.Columns)%>
        
<%{%>
        
public <%=GetCSDataType(column)%> <%=column.Name%>
        {
            
getreturn m_<%=column.Name%>;}
            
set{ m_<%=column.Name%>=value;}
        }
        
<%}%>
        
    }
}
<script runat="template">
// My methods here.

public string GetCSDataType(ColumnSchema column)
{
       
switch (column.DataType)
       {
              
case DbType.AnsiString: return "string";
              
case DbType.AnsiStringFixedLength: return "string";
              
case DbType.Binary: return "byte[]";
              
case DbType.Boolean: return "bool";
              
case DbType.Byte: return "byte";
              
case DbType.Currency: return "decimal";
              
case DbType.Date: return "DateTime";
              
case DbType.DateTime: return "DateTime";
              
case DbType.Decimal: return "decimal";
              
case DbType.Double: return "double";
              
case DbType.Guid: return "Guid";
              
case DbType.Int16: return "short";
              
case DbType.Int32: return "int";
              
case DbType.Int64: return "long";
              
case DbType.Object: return "object";
              
case DbType.SByte: return "sbyte";
              
case DbType.Single: return "float";
              
case DbType.String: return "string";
              
case DbType.StringFixedLength: return "string";
              
case DbType.Time: return "TimeSpan";
              
case DbType.UInt16: return "ushort";
              
case DbType.UInt32: return "uint";
              
case DbType.UInt64: return "ulong";
              
case DbType.VarNumeric: return "decimal";
              
default:
              {
                     
return "__UNKNOWN__" + column.NativeType;
              }
       }
}
</script>

 

  在这里,首先定义欲生成的表信息"SourceTable",必须添加"SchemaExplorer"的引用。其它的就是如何按表结构输出到CS文件了(这里以实体类为例)。

  再看一下主模板:

  代码

 

   在主模板中,定义了"Tables"表示欲生成的表集合,"MakeDir"定义了生成文件保存的目录;

  <%@ Register Name="MyEntity" Template="C:\Documents and Settings\taurus\My Documents\CodeSmith\Templates\MyDemo\Entity.cst" MergeProperties="False" ExcludeProperties="" %>

  这个就是注册子模板,必须添加<%@ Assembly Name="CodeSmith.BaseTemplates" %>

<%@ Import Namespace="CodeSmith.BaseTemplates" %>,以增加对BaseTemplates的引用。

  然后,在"OutputSubTemplate"函数中调用子模板输出文件

  CodeTemplate temp = new MyEntity();

    temp.SetProperty("SourceTable",table);    

    temp.RenderToFile(MakeDir+"\\"+table+".cs",true); 

  这里,RenderToFile的第一个参数是输出文件名,第二个参数是是否覆盖原文件。

  这样,通过在主文件中调用多个子模板文件,完成针对实体类、数据处理类以及前端文件的批量生成。

 

  参考:http://www.cnblogs.com/lovko/archive/2009/06/19/1506840.html 

     http://bear-study-hard.cnblogs.com/archive/2005/12/19/300320.html 

posted @ 2010-03-11 15:35  *王员外*  阅读(2305)  评论(0编辑  收藏  举报