我对T4模板比较陌生。我在visual studio 2012工作并使用有形的T4编辑器。我在一个项目中有我的文本模板,我想在另一个项目中读取一个类并进行一些处理并将生成的代码写入第三个项目。我想将类文件路径传递给我的模板例如" C:/Code/Project2/ClassFooBar.cs"模板将从给定位置读取类,并使用类属性进行一些处理,并将生成的代码写入project3。我想传递文件路径,因为我的项目有许多类文件,并且没有我可以在模板中指定的模式。
我的解决方案结构是:
SolutionFoo:
- Project1
-TextTemplate.tt
- Project2
- ClassFooBar.cs
- Project3
-GeneratedCode.cs
任何人都可以用一种干净的方式传递类路径以及将生成的代码写入Project3的方法来指导我吗?
答案 0 :(得分: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);
}
答案 1 :(得分:2)
为了避免文件锁定问题或者如果您不想引用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