摘要中的T4代码生成(无自动编译,无自动文件管理)

时间:2014-10-31 17:55:17

标签: c# visual-studio-2013 code-generation t4 vsix

我们有一种情况,我们基本上想要通过传递模板内容的参数和模板需要自己构建的信息来生成代码文件的字符串表示:

//***  PSEUDO CODE *** //
//loaded from an embedded resource file in a .dll. no physical file on file system
string templateContents = ...; 
//has properties used by the template 
object complexParameter = ...; 

string generatedCode = generator.MakeCode(templateContents, complexParameter);

但是,我们目前遇到的问题是尝试让T4模板生成我们想要的东西。我们使用的实际代码是:

var templatingEngine = new Engine();
//T4TextTemplateHost is our own class implementing ITextTemplatingEngineHost & IServiceProvider
var templateHost = new T4TextTemplateHost(references, imports)
{
    Properties = parameters,
    //this is supposed to be a file path? the generation bombs if this is left null
    TemplateFile = "Dummy Value"
};
var templateContents = GetTemplateFileContents();
var retVal = templatingEngine.ProcessTemplate(templateContents, templateHost);

//if a CompilerError occurs, we get NO code, just a "ErrorGeneratingOutput" message
foreach (CompilerError error in templateHost.Errors)
    //this information is pretty worthless: a compile error with line number for a 
    //non-existant code file
    retVal += String.Format("{0}{2}Line: {1}{2}{2}", error.ErrorText, 
                            error.Line, Environment.NewLine);

问题在于代码生成器似乎期望在某处出现物理文件,当出现问题时,我们无法获取代码,我们会收到无用的错误消息。我们强烈倾向于不要自动编译代码,特别是当生成的代码有错误时(我们希望在排除故障时检查完整的,损坏的文件)。

我们还希望输出为字符串,我们可以随意使用。

有没有办法让T4代码生成更像伪代码示例?我们即将放弃使用T4工具,转而使用像CodeSmith这样的东西,因为T4似乎过于有限/适合于管理模板和处理输出的非常具体的方式。

1 个答案:

答案 0 :(得分:1)

如果传入的模板中存在错误,我认为不可能让T4生成任何内容.T4会尝试将模板转换为encodeom,并使用写入字符写入器的额外语句,最终的字符写入器然后返回结果。如果模板中有任何错误,代码将无法编译,因此无法返回给您。你得到的错误应该解析为你传入的模板中的行,至少这是我的经验。

我不确定Code Smith是否以不同的方式工作,但是根据您尝试渲染的复杂程度,如果它足够简单,您可以使用Nustache获得一些运气。它是小胡子模板的点网版本。它支持基本循环和if / then类型控制块。我已成功将其与嵌入式文本文件一起使用,以生成用于电子邮件和报告的简单模板。