试图向t4模板传递参数时出现错误

4

我试图(但失败了)编写一个简单的模板文件:

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ include file="T4Toolbox.tt" #>
<#@ property name="ClassName" processor="PropertyProcessor" type="System.String" #>

public class <#= ClassName #>
{
}

当我在Visual Studio中点击模板时,属性窗口中有'ClassName'这个属性。这正是我想要的!当我在那里输入文本并构建时,会出现以下错误:
 Error  1   Running transformation: System.ArgumentNullException: Value cannot be null.
Parameter name: objectToConvert
   at Microsoft.VisualStudio.TextTemplating.ToStringHelper.ToStringWithCulture(Object objectToConvert)
   at Microsoft.VisualStudio.TextTemplating32ED7F6BD49D2C3984C2CB7194792D4B.GeneratedTextTransformation.TransformText() in c:\Users\neilt.PAV12\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\ClassMaker.tt:line 6  C:\Users\neilt.PAV12\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\ClassMaker.tt    1   1   

希望你能明白我的意思:我希望我的模板可以输出一个以我在Visual Studio属性窗口中设置的字符串命名的.cs文件,其中包含一个类。可悲的是,我在早期的步骤中就失败了!

这个问题似乎在这里有一些见解:http://social.msdn.microsoft.com/Forums/en-US/vsgatk/thread/f0059983-62dd-4e98-b714-170e7ae2c32c - Robert Harvey
3个回答

3

您应该首先调用Initialize()方法,像这样:

ClassTemplate t = new ClassTemplate();
t.Session = new Dictionary<string, object>();
t.Session["ClassName"] = "Person";

t.Initialize();//This is important.

string output = t.TransformText();
Console.WriteLine(output);

0

当我将我的项目升级到VS2017时,我遇到了同样的问题,但是我通过在2017 IDE中创建模板来解决了它。


0

上次我尝试过, 这种情况不起作用,因为没有标准的处理器来处理属性指令,并且在Visual Studio中也不支持它。您可能正在使用Clarius T4编辑器提供的有限支持此指令的功能;我记得曾经遇到过类似的错误。


那么没有其他方法可以做到这一点吗?我原本希望能够使用Visual Studio设计时工具,例如允许您选择数据库连接的工具,然后将我的模板生成器所需创建DAL的数据库传递给它。难道只有手动设置模板中的数据库名称是我唯一的选择吗? - Neil Trodden
@OlegSych:链接已经失效了。如果可能的话,您能否更新一下? - Venkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接