【问题标题】:T4 Templates - Reading a class file given the file pathT4 模板 - 在给定文件路径的情况下读取类文件
【发布时间】:2014-04-23 09:53:52
【问题描述】:

我对 T4 模板比较陌生。我在 Visual Studio 2012 工作并使用有形的 T4 编辑器。我在一个项目中有我的文本模板,我想在另一个项目中读取一个类并进行一些处理并将生成的代码写入第三个项目。我想将类文件路径传递给我的模板例如“C:/Code/Project2/ClassFooBar.cs”,模板将从给定位置读取类并使用类属性进行一些处理并编写生成的代码到项目3。我想传入文件路径,因为我的项目有许多类文件,并且没有我可以在模板中指定的模式。

我的解决方案结构是:

SolutionFoo:
 - Project1
    -TextTemplate.tt   

 - Project2
   - ClassFooBar.cs

 - Project3
    -GeneratedCode.cs

任何人都可以指导我以一种干净的方式传递类路径以及将生成的代码写入 Project3 的方式吗?

【问题讨论】:

  • 我可能误解了这个问题 - 是什么阻止您将项目引用添加到您的 T4 项目,获取您所引用文件中的类的类型,并反映要生成的类型代码?

标签: c# code-generation t4


【解决方案1】:

为了避免文件锁定问题或者如果您不想引用您的 Project2,请尝试我喜欢称之为“设计时反射”的方法。

由于您在同一个解决方案中拥有两个项目(一个包含 T4 和一个包含您要反映的类),您可以使用 EnvDTE.CodeModel 横穿解决方案中的所有代码工件(命名空间、类、 ...) 无需构建和引用 Project2。

看看VisualStudio Automation。如果您使用的是tangible's T4 Editor,他们的图库中有一个免费的可重复使用的模板,可以方便地从 T4 模板中访问 EnvDTE.CodeModel。

这可能是一个很好的起点:http://t4-editor.tangible-engineering.com/blog/walking-the-visual-studio-code-model-with-t4-template.html

【讨论】:

    【解决方案2】:

    I recently wrote up a description of this for another question。不要阅读类文件。相反,使用反射来处理生成的类。这将比尝试解析 c# 简单得多。

    [编辑 - 附加未经测试的伪代码] 使用 System.Reflection;

    private void Reflect()
    {
         var properties = typeof(ClassFoobar).GetProperties();
         var myRuntimeTemplate = new MyRuntimeTemplate();
         myRuntimeTemplate.DoSomeMethodDefinedInT4(properties);
    }
    

    【讨论】:

    • 谢谢你,菲利普,你的描述很有道理。你能给出一些关于如何使用反射来实现这一点的伪代码吗?感谢你的帮助。我还看到这个链接说反射也会锁定程序集:stackoverflow.com/questions/1856885/…
    • 至于文件锁定,这是在 IDE 中使用设计时 t4 时的问题。如果您阅读另一篇文章中的 cmets,有人声称这已在 VS2012 中修复。对于运行时 T4,文件锁定会在运行它的命令行程序完成后立即释放。
    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多