代码之家  ›  专栏  ›  技术社区  ›  Neil Trodden

尝试将参数传递到T4模板时出错

  •  3
  • Neil Trodden  · 技术社区  · 16 年前

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

    <#@ 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   
    

    希望您能看到我想要做的:我希望我的模板能够输出一个.cs文件,其中一个类的名称与我在Visual Studio的属性窗口中设置的字符串相同。可悲的是,我很早就失败了!!

    3 回复  |  直到 6 年前
        1
  •  0
  •   Oleg Sych    16 年前

    Last time I tried ,此方案不起作用,因为没有用于属性指令的标准处理器,并且在Visual Studio中不支持它。您可能使用了Clarius T4编辑器为此指令提供的有限支持;我记得也遇到了类似的错误。

        2
  •  2
  •   Jason Sturges    12 年前

    你应该调用 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);
    
        3
  •  0
  •   Robert Harvey    16 年前