【问题标题】:Pass an Object to a T4 Text Template将对象传递给 T4 文本模板
【发布时间】:2013-03-09 01:19:34
【问题描述】:

我有一个 T4 模板,我试图在运行时将对象值传递给它。

基本上我们想要做的是:

  1. 从 Windows .NET 表单中,以文本形式读取文件

  2. 将外部对象属性设置为文本值

  3. 在具有输出的 T4 文本模板中访问该对象属性 .java 的扩展名。

我现在开始非常简单,我只有模板和表单,并说一个外部类对象:

当然,阅读表单部分中的文本并设置像 foo.foocode 这样的对象属性是相当简单的。

我只是不知道如何在模板中访问该对象变量或属性,我已经研究了一天多..

谢谢

【问题讨论】:

  • 道格,问题不清楚。您提到了您的自定义 t4 生成器,我们对它的工作原理没有任何线索。此外,还不清楚您提到的确切“运行时”-自定义生成器的运行时、模板类生成中 t4 的运行时、t4 生成的类的运行时或 t4 生成的代码的运行时类。
  • @Wiktor 提出了一些好处-您是否尝试添加preprocessed template(我认为来自代码生成文件夹),它会同时生成 .tt(在其下方带有自动生成的 .cs)+ *.partial.cs 文件?我认为这是让你走的最短路线。有了它,您就拥有了可以访问的“对象”类,将参数传递给构造函数+ .tt 文件,该文件“扩展”了该类并可以使用您传入的任何内容。这一切都很好,而且在更复杂的场景中。
  • 对内容不够清晰深表歉意。我会更新帖子。
  • 我尝试了预处理模板,但无法将输出类型更改为.java。谢谢
  • 出于好奇...您是在制作 UML 或 C# 到 Java 工具吗?

标签: c# .net t4


【解决方案1】:

在运行时您只能转换预处理的模板,因为模板引擎不是 Visual Studio 的可再分发部分。您可以使用parameter directive 将对象传递给预处理模板。传递给模板的对象类型必须用SerializableAttribute 修饰。在调用TransformText() 方法之前,将参数的值放入模板会话中。

使用预处理模板时会忽略输出扩展指令。 TransformText() 方法返回带有生成代码的字符串。您可以将其保存为您想要的任何文件类型。

<#@ template debug="true" #>
<#@ parameter name="MyObject" type="MyNamespace.MyType" #>

<#
  // now access the passed parameter using
  this.MyObject
#>

调用预处理模板:

var templateInstance = new MyTemplate();
templateInstance.Session = new Dictionary<string, object>();
templateInstance.Session.Add("MyObject", new MyType());
templateInstance.Initialize();

var generatedCode = templateInstance.TransformText();

System.IO.File.WriteAllText("outputfile.java", generatedCode);

希望这会有所帮助。

【讨论】:

  • 谢谢 Nico.. 我会调查的!
  • 我似乎无法使用此方法访问此公共类的公共属性或方法...不确定我是否应该。谢谢
  • 抱歉!我只是自己尝试了一下,发现我忘了初始化模板。答案已更新。
  • 我想我的意思是智能感知似乎在设计时不起作用。换句话说,我在设计时看不到方法或属性..再次感谢..
  • Visual Studio 没有内置提供智能感知的 T4 模板编辑器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多