在開發過程中 我經常出現寫重復代碼的情況 比如說增刪改查,然后看ABP框架的時候看到代碼生成器 發現代碼生成器居然這么強大居然還可以生成增刪改查和HTML這些代碼,話不多說 能讓你少寫點代碼的東西 何樂而不為呢
由於博主沒有怎么寫過博客園的文檔 樣式可能有點丑 還望各位包涵 由於本人對T4還沒有研究透徹 說的不好的地方還望各位海涵
新建項 新建T4文本文檔 如下

完成后生成以下代碼

解釋:
-
T4模板指令:該指令指定應如何處理模板
<#@ template debug="false" hostspecific="false" language="C#" #>
指令:<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
更多解釋:https://msdn.microsoft.com/zh-cn/library/gg586945.aspx
-
T4程序集指令:指令可加載程序集,以便您的模板代碼可使用其類型。
<#@ assembly name="System.Core" #>
指令:<#@ assembly name="[assembly strong name|assembly file name]" #>
更多解釋:https://msdn.microsoft.com/zh-cn/library/gg586946.aspx
-
T4導入指令:指令允許您在不提供完全限定名稱的情況下引用另一個命名空間中的元素
<#@ import namespace="System.Linq" #>
指令:<#@ import namespace="namespace" #>
更多解釋:https://msdn.microsoft.com/zh-cn/library/gg586948.aspx
-
T4輸出指令:用於定義已轉換文件的文件擴展名和編碼
<#@ output extension=".txt" #>
指令:<#@ output extension=".fileNameExtension" [encoding="encoding"] #>
更多解釋:https://msdn.microsoft.com/zh-cn/library/gg586943.aspx
在這里我們還需要一個指令 用該指令將我們添加的運行時文本模板導入進來
T4包含指令:通過使用 <#@include#> 指令可包括來自另一個文件的文本
<#@ include file="T4Toolbox.tt" #>
指令:<#@ include file="filePath" #>
更多解釋:https://msdn.microsoft.com/zh-cn/library/gg586949.aspx
添加運行時文本模板 (創建該模板的是我們生成的類文件的模型)

創建成功后的屬性


但是我們不需要自定義工具這項 直接刪除

這樣這個模板就沒有下拉這個了

現在為創建一個模型在這個模板里面 代碼如下:
<#+
public class BLLTemplate : CSharpTemplate
{
string name;
public BLLTemplate(string modelName)
{
name = modelName;
}
/// <summary>
/// 獲取 生成的文件名,根據模型名定義
/// </summary>
public string FileName
{
get
{
return string.Format("{0}BLL.cs", EntityName);
}
}
/// <summary>
/// 實體名稱
/// </summary>
public string EntityName
{
get
{
return name.Replace("Model", string.Empty);
}
}
public override string TransformText()
{
base.TransformText();
#>
//------------------------------------------------------------------------------
// <auto-generated>
// 此代碼由工具生成。
// 對此文件的更改可能會導致不正確的行為,並且如果
// 重新生成代碼,這些更改將會丟失。
// 提示:如存在本生成代碼外的新需求,請在相同命名空間下創建同名分部類實現分部方法。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test.BLL
{
/// <summary>
/// 邏輯層
/// </summary>
public partial class TestBLL
{
}
}
<#+
return this.GenerationEnvironment.ToString();
}
}
#>
現在bll模型已經創建成功現在回到最開始創建的文本模板TextTemplate2.tt里面
插入以下代碼
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ Import Namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Reflection" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
//這個必填 導入T4工具
<#@ include file="T4Toolbox.tt" #>
//這里填寫bll模型的路徑 當前TextTemplate2.tt目錄下的Template文件夾里的BLLTemplate1.tt
<#@ include file="Template/BLLTemplate1.tt" #>
<#
//當前TextTemplate2.tt所在的模板路徑
//Host.Template 是當前文本模板TextTemplate2.tt的路徑
var currentPath = Path.GetDirectoryName(Host.TemplateFile);
//解決方案路徑
string solutionPath = currentPath.Substring(0, currentPath.LastIndexOf("\\"));
//項目名稱
string projectFullName = currentPath.Substring(currentPath.LastIndexOf("\\") + 1);
string model= "TestModel";
//實例化bll模板
BLLTemplate bll= new BLLTemplate(model);
string filePath= Path.Combine(currentPath,"bll", bll.FileName);
//創建文件
bll.RenderToFile(filePath);
#>
然后保存生成了文件

由於本人對這個基本概念也不是很了解 所以大家不懂得可以多參考資料 我這里只是實現
參考:
文本模板控制塊:https://msdn.microsoft.com/zh-cn/library/bb126545.aspx
文檔:https://msdn.microsoft.com/zh-cn/library/bb126445.aspx
入門:http://www.cnblogs.com/heyuquan/archive/2012/07/26/2610959.html
