天天看點

CodeSmith基本學習【1】

    廢話不多說,下面我們來生成一個簡單的實體類的例子(我用的是6.5的),目标代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// <summary>
/// author:lanzhaoyi
/// createtime:2012-12-03 13:08:17
/// </summary>
namespace LZ_MIS.Entity{
     
     /// <summary>
     /// 
     /// </summary>
     public partial class Role    {        
        
        /// <summary>
        /// 
        /// </summary>
        public uint ID{ get;set; }        
        
        /// <summary>
        /// 
        /// </summary>
        public string Name{ get;set; }        
        
        /// <summary>
        /// 
        /// </summary>
        public string Remark{ get;set; }        
     }
}


           

步驟如下:

    1、建立一個模版

         滑鼠單擊File->New->CShareTemplate

         這樣我們就建立了一個C#模版,模版代碼如下:

<%-- 
Name:
Author: 
Description: 
--%>
<%@ Template Language="C#" TargetLanguage="Text" %>
<%@ Property Name="SampleStringProperty" Default="SomeValue" Type="System.String" %>
<%@ Property Name="SampleBooleanProperty" Default="True" Type="System.Boolean" %>
My static content here.
My dynamic content here: "<%= SampleStringProperty %>"
Call a script method: <%= SampleMethod() %>
<% if (SampleBooleanProperty) { %>
My conditional content here.
<% } %>
<script runat="template">
// My methods here.
public string SampleMethod()
{
  return "Method output.";
}
</script>
           

Template:模版标間   Language  模版語言     TargetLanguage  生成檔案的語言                                        注:此标簽是必須的,它告訴我們了模版的基本資訊

Property  屬性          Name   屬性名稱           Default  屬性對應的預設值                 Type  屬性的類型     注:聲明此屬性後可以在右邊屬性頁籤中可能到

<%%> 之間是我們要用來生成代碼的腳本,如果為在<%%>的内容會直接原樣輸出的

<%=變量或方法%>   它可以直接輸出變量的值或方法的傳回值 

2、加載資料庫的程式集與命名空間

    我們在生成資料庫表對應的實體類的時候,我們需要連接配接上對應的資料庫。這個時候我們就需要在模版中加載對應的内容

    首先我們将

<%-- 
      Name:
      Author: 
      Description:
     --%>

     <%@ Template Language="C#" TargetLanguage="Text" %>保留,其它沒用的都删掉,加上對應的程式集與命名空間:
     <%@ Assembly Name="SchemaExplorer" %>
     <%@ Import Namespace="SchemaExplorer" %>
           

3、聲明屬性

    現在我們要隻對對應的生成那個哪個表對應的實體類和實體類存放在哪個命名空間下

<%@ Property Name="Table" Type="TableSchema"%>
<%@ Property Name="NameSpace" Type="String" Category="Content" %>
           

4、實作實體類的生成

   這一步是我們生成實體類的主要部分,見代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// <summary>
/// author:lanzhaoyi
/// createtime:<%= DateTime.Now %>
/// </summary>
namespace <%=NameSpace %>.Entity{
     
     /// <summary>
     /// <%=Table.Description %>
     /// </summary>
     public partial class <%= DelHead(Table.Name)%>    {        
        <% foreach(ColumnSchema col in Table.Columns){ %>
        
        /// <summary>
        /// <%= col.Description %>
        /// </summary>
        public <%= DataType2CSharpType(col.DataType) %> <%=DelHeadOne(col.Name) %>{ get;set; }        
        <% } %>    
     }
}
           

NameSpace 則是我們上面定義的屬性,測試的時候我們可以在右邊的屬性頁籤中初始指派

Table 也是我們對表的屬性定義,在右邊屬性頁籤中可初始指派

Table.Description 表的描述(我用的是MYSQl在輸出表描述和字段描述時候始終是空,大家有好的方法給我說下謝謝)

DelHead 和DataType2CSharpType則是兩個方法,用于處理字元串和類型轉換,代碼:

/// <summary>
    ///把資料庫類型轉化為C#類型
    /// </summary>
    public string DataType2CSharpType(System.Data.DbType dbType)
    {
        switch (dbType)
        {
            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.DateTime2:
                return "DateTime";
            case DbType.DateTimeOffset:
                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 "DateTime";                
            case DbType.UInt16:
                return "ushort";
            case DbType.UInt32:
                return "uint";
            case DbType.UInt64:
                return "ulong";
            case DbType.VarNumeric:
                return "decimal";
            case DbType.Xml:
                return "string";
            default:
                return "object";
        }
    }
    /// <summary>
    /// 字元串轉化為小寫
    /// </summary>
    public string ToLowercase(string str)
	{
		str = str.ToLower();	
		return str;
	}
	
	/// <summary>
    /// 泛型
    /// </summary>
	public string ToGeneric(string str)
	{
		str = "<" + str + ">";	
		return str;
	}
    ///因為我的所有表前面都加了XX_ 字段前面都加了L_是以我要把字首去掉,且首字母大寫    
    public string ToHeadUpper(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+2),str.Substring(0,str.IndexOf('_')+2).ToUpper());
        return str;
    }
    
    public string DelHead(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+2),str.Substring(0,str.IndexOf('_')+2).ToUpper());
        str = str.Substring(str.IndexOf('_')+1);
        return str;
    }
    
    public string DelHeadOne(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+1),str.Substring(0,str.IndexOf('_')+1).ToUpper());
        str = str.Substring(str.IndexOf('_')+1);
        return str;
    }
</script>
           

好了,我們所有的代碼都寫完了,然後我們點選上方的“Generate”按鈕測試一下,就是生成對應表的實體層代碼

完整代碼如下:

<%-- 
Name:實體類
Author:Description:用于動态建立實體類 
--%>
<%@ Template Language="C#" TargetLanguage="C#" %>

<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<%@ Property Name="Table" Type="TableSchema"%>
<%@ Property Name="NameSpace" Type="String" Category="Content" %>

<script runat="template">
    /// <summary>
    ///把資料庫類型轉化為C#類型
    /// </summary>
    public string DataType2CSharpType(System.Data.DbType dbType)
    {
        switch (dbType)
        {
            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.DateTime2:
                return "DateTime";
            case DbType.DateTimeOffset:
                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 "DateTime";                
            case DbType.UInt16:
                return "ushort";
            case DbType.UInt32:
                return "uint";
            case DbType.UInt64:
                return "ulong";
            case DbType.VarNumeric:
                return "decimal";
            case DbType.Xml:
                return "string";
            default:
                return "object";
        }
    }

    /// <summary>
    /// 字元串轉化為小寫
    /// </summary>
    public string ToLowercase(string str)
	{
		str = str.ToLower();	
		return str;
	}
	
	/// <summary>
    /// 泛型
    /// </summary>
	public string ToGeneric(string str)
	{
		str = "<" + str + ">";	
		return str;
	}
    
    public string ToHeadUpper(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+2),str.Substring(0,str.IndexOf('_')+2).ToUpper());
        return str;
    }
    
    public string DelHead(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+2),str.Substring(0,str.IndexOf('_')+2).ToUpper());
        str = str.Substring(str.IndexOf('_')+1);
        return str;
    }
    
    public string DelHeadOne(string str){
        str =  str.Replace(str.Substring(0,str.IndexOf('_')+1),str.Substring(0,str.IndexOf('_')+1).ToUpper());
        str = str.Substring(str.IndexOf('_')+1);
        return str;
    }
</script>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// <summary>
/// author:lanzhaoyi
/// createtime:<%= DateTime.Now %>
/// </summary>
namespace <%=NameSpace %>.Entity{
     
     /// <summary>
     /// <%=Table.Description %>
     /// </summary>
     public partial class <%= DelHead(Table.Name)%>    {        
        <% foreach(ColumnSchema col in Table.Columns){ %>
        
        /// <summary>
        /// <%= col.Description %>
        /// </summary>
        public <%= DataType2CSharpType(col.DataType) %> <%=DelHeadOne(col.Name) %>{ get;set; }        
        <% } %>    
     }
}