T4 (Text Template Transformation Toolkit) 是一個基於模板的程式碼生成器。使用T4你可以通過寫一些ASP.NET-like模板,來生成C#, T-SQL, XML等程式碼。
一 “Hello World ”程式碼生成器
1 建立一個C# Console工程,新增一個名為“HelloWorld.tt”的文字檔案。
如果你正在使用Visual Studio 2005你需要安裝 DSL Tools。 |
template language="C#" #>
//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//
using System;
public class this.ClassName #>
{
public static void HelloPot()
{
Console.WriteLine("Hello World");
}
}
上面的模板將生成一個名為“HelloWorld”的類,當你儲存HelloWorld.tt時,Visual Studio將為你生成以下程式碼:
//
// the next time this code is regenerated.
//
using System;
public class HelloWorld
{
public static void HelloPot()
{
Console.WriteLine("Hello World");
}
}
3 新增另一個文字檔案HelloWorld1.tt.,加入以下內容:
this.ClassName = "HelloWorld1";
#>
include file="HelloT4.tt" #>
通過修改ClassName的值可以更改類名,以上模板將生成一個名為HelloWorld1類。
//
// the next time this code is regenerated.
//
using System;
public class HelloWorld1
{
public static void HelloPot()
{
Console.WriteLine("Hello World");
}
}
二 資料庫自動生成實體類
這個例項會建立一個模板為資料庫中的每一張表,自動建立相應的實體類。
1 首先我們需要新增一些程式集引用,名稱空間。
template language="C#" debug="True" hostspecific="True" #>
output extension=".cs" #>
assembly name="System.Data" #>
assembly name="System.xml" #>
import namespace="System.Collections.Generic" #>
import namespace="System.Data.SqlClient" #>
import namespace="System.Data" #>
2 獲取資料庫表結構.
string connectionString = "data source=.""SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MIAPortal;";
SqlConnection conn = newSqlConnection(connectionString);
conn.Open();
System.Data.DataTable schema = conn.GetSchema("TABLES");
string selectQuery = "select * from @tableName";
SqlCommand command = new SqlCommand(selectQuery,conn);
SqlDataAdapter ad = new SqlDataAdapter(command);
System.Data.DataSet ds = new DataSet();
我們通過GetSchema("TABLES")獲取了資料庫中所有表的表名,接著通過表名,獲取相應表的表結構。
3 生成程式碼
template language="C#" debug="True" hostspecific="True" #>
output extension=".cs" #>
assembly name="System.Data" #>
assembly name="System.xml" #>
import namespace="System.Collections.Generic" #>
import namespace="System.Data.SqlClient" #>
import namespace="System.Data" #>
using System;
namespace MyProject.Entities
{
string connectionString = "data source=.""SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=MIAPortal;";
SqlConnection conn = newSqlConnection(connectionString);
conn.Open();
System.Data.DataTable schema = conn.GetSchema("TABLES");
string selectQuery = "select * from @tableName";
SqlCommand command = new SqlCommand(selectQuery,conn);
SqlDataAdapter ad = new SqlDataAdapter(command);
System.Data.DataSet ds = new DataSet();
foreach(System.Data.DataRow row in schema.Rows)
{ #>
public class "TABLE_NAME"].ToString().Trim('s') #>
{
ds.Tables.Clear();
command.CommandText = selectQuery.Replace("@tableName",row["TABLE_NAME"].ToString());
ad.FillSchema(ds, SchemaType.Mapped, row["TABLE_NAME"].ToString());
foreach (DataColumn dc in ds.Tables[0].Columns)
{ #>
private _0].ToString(), dc.ColumnName[0].ToString().ToLower()) #>;
public
{
get { return _0].ToString(), dc.ColumnName[0].ToString().ToLower()) #>; }
set { _0].ToString(), dc.ColumnName[0].ToString().ToLower()) #> = value; }
}
}
} #>
}