我正在尝试(并且失败)编写一个简单的模板文件:
<#@ 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文件。可悲的是,我很早就失败了!
答案 0 :(得分:2)
您应首先调用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);
答案 1 :(得分:0)
这里似乎对这个问题有所了解:
http://social.msdn.microsoft.com/Forums/en-US/vsgatk/thread/f0059983-62dd-4e98-b714-170e7ae2c32c
答案 2 :(得分:0)
Last time I tried,这种情况不起作用,因为属性指令没有标准处理器,并且在Visual Studio中不支持它。您可能正在使用Clarius T4编辑器为此指令提供的有限支持;我记得得到了类似的错误。
答案 3 :(得分:0)
将项目升级到VS2017时遇到了相同的问题,并通过在2017 IDE中创建模板来修复了该问题。