从T4模板调用同一项目中的类

use*_*570 7 .net c# t4

我正在尝试为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()
            ...
    #>
    }
}
Run Code Online (Sandbox Code Playgroud)

错误:

编译转换:找不到类型或命名空间名称"MyClass"(您是否缺少using指令或程序集引用?)

它是同一个项目中的公共类.我可以从项目中的其他类访问它而不是T4文件.还是一个T4新手.任何方向将不胜感激.

Phi*_*ens 7

你想做的事情不会是直截了当的.

为了使T4使用类(即MyClass),生成器必须引用包含的程序集或完全在T4中定义的类(这是EF代码生成器所做的).此外,您可能正在使用设计时T4(让IDE进行生成).设计时t4生成器将保存对dll的引用,因此您将无法再次构建项目.您实际上必须关闭Visual Studio并重新启动它.<感叹>

如果您决定继续第一种方法 - 我非常赞同 - 您将希望将代码分成两个程序集(实际上是3个).一个将包含您编写的代码,如MyClass.第二个是生成的代码.

创建第三个程序集(命令行项目)并在此处使用运行时t4.这个项目可以引用你的第一个程序集(使用MyClass),并用它做任何你想做的事情,包括你在这里展示的代码!将代码生成到第二个程序集中.

在第一个项目的项目设置中,将第三个项目的命令行工具作为构建后事件调用.这也可以是第二个项目的预构建事件.

我用这种方法创建了几个成功的面向方面编程(AOP)解决方案.唉,这可能不是你所希望的答案.

如果你真的很勇敢,可以让命令行工具生成回原始项目.这将需要您编译两次.我现在不能推荐这个.