我有一个包含文本模板的c#项目。我希望这个模板基于反映项目中的C#类来生成一些SQL。
如何使用T4访问当前项目的内容?是否有可能,如果可以,是否可以使用Reflection,或者只访问必须解析的原始源?
提前致谢!
答案 0 :(得分:5)
如何使用T4访问当前项目的内容?
一种方法是使用EnvDTE COM组件。谷歌搜索T4和EnvDTE应该带回大量的例子。
是否可能,如果是,可以使用Reflection,或者是否可以访问 只是必须解析的原始来源?
T4绝对可以提供反思。它的工作方式大多与您期望的一样。
Oleg Sych有许多关于常见T4使用场景的精彩博客文章,但T4还有很多其他资源。
答案 1 :(得分:4)
完全不考虑锁定问题,请小心使用T4模板中的反射。 VS2010中的模板生成器针对Framework 4.0版运行,因此如果您生成3.5或更低版本的代码,则可能会引入不需要的依赖项。
在使用反射决定是否为各种BCL类型生成ToString
的无参数或参数化调用之后,我刚刚发现了这个问题。 TimeSpan
在2.0中只有ToString()
,但4.0增加了ToString(string)
:P
答案 2 :(得分:0)
虽然这并没有解决锁定问题(虽然我听说过VS2010会这样做),但您可以尝试将dll复制到临时位置并使用复制的程序集。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#
var newFileName = System.IO.Path.GetTempFileName();
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true);
var assembly = Assembly.LoadFrom(newFileName);
var type = assembly.GetType("CustomAssembly.DummyClass");
#>
<#=newFileName#>
<#=type#>