簡體   English   中英

從T4模板調用同一項目中的類

[英]Calling a class in the same project from T4 template

我正在嘗試為CRUD類創建一些腳手架,並希望使用T4來幫助構建這些類。 我剛剛開始並且在調用一個住在同一個項目中的類時遇到了問題。 例如:

<#@ import namespace="System.Collections.Generic" #>
<#@ template    language="C#"   #>
<#@ output      extension=".cs" #>
<#@ include file="T4Toolbox.tt" #>

using System;
using System.Data;
using System.Data.Linq;
using System.Collections.Generic;

namespace TTFileGenerator
{
<#var entityName = "TEST";#>
    public class <#=entityName#>
    {
    <#
            MyClass myClass = new MyClass();
            List<string> something = myClass.GetSomething()
            ...
    #>
    }
}

錯誤:

編譯轉換:找不到類型或命名空間名稱“MyClass”(您是否缺少using指令或程序集引用?)

它是同一個項目中的公共類。 我可以從項目中的其他類訪問它而不是T4文件。 還是一個T4新手。 任何方向將不勝感激。

你想做的事情不會是直截了當的。

為了使T4使用類(即MyClass),生成器必須引用包含的程序集或完全在T4中定義的類(這是EF代碼生成器所做的)。 此外,您可能正在使用設計時T4(讓IDE進行生成)。 設計時t4生成器將保存對dll的引用,因此您將無法再次構建項目。 您實際上必須關閉Visual Studio並重新啟動它。 <感嘆>

如果您決定繼續第一種方法 - 我非常贊同 - 您將希望將代碼分成兩個程序集(實際上是3個)。 一個將包含您編寫的代碼,如MyClass。 第二個是生成的代碼。

創建第三個程序集(命令行項目)並在此處使用運行時t4 這個項目可以引用你的第一個程序集(使用MyClass)並用它做任何你想做的事情,包括你在這里展示的代碼! 將代碼生成到第二個程序集中。

在第一個項目的項目設置中,將第三個項目的命令行工具作為構建后事件調用。 這也可以是第二個項目的預構建事件。

我用這種方法創建了幾個成功的面向方面編程(AOP)解決方案。 唉,這可能不是你所希望的答案。

如果你真的很勇敢,可以讓命令行工具生成回原始項目。 這將需要您編譯兩次。 我現在不能推薦這個。

想象一下,我會添加一些代碼來幫助其他人,盡管菲利普在頭上打了一針。

我不得不打破我想要調用另一個程序集的類,並使用相對路徑進行程序集引用。 我沒有看到任何鎖定(VS 2012)...如果在轉換T4模板之前進行任何更改,您只需要記住構建此程序集:

//Reference to another project (for testing, it lives in the debug folder)
<#@ assembly name="$(SolutionDir)\MyAssembly\bin\x86\Debug\MyAssembly.dll"#>

<#  
    var helper = new Utilities.MyHelperClass();
#>

<#
     var something = helper.GetSomething(param1, param2);
#>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM