你如何使用.netreflection与T4?

我有一个包含文本模板的ac #project。 我希望这个模板基于反映项目中的C#类来生成一些SQL。

如何使用T4访问当前项目的内容? 是否可能,如果是,可以使用Reflection,还是只访问必须解析的原始源?

提前致谢!

如何使用T4访问当前项目的内容?

一种方法是使用EnvDTE COM组件。 谷歌搜索T4和EnvDTE应该带回大量的例子。

是否可能,如果是,可以使用Reflection,还是只访问必须解析的原始源?

T4绝对可以提供反思。 它的工作方式大多与您期望的一样。

Oleg Sych有很多关于常见T4使用场景的博客文章,但是T4还有很多其他资源。

除了锁定问题之外,请小心使用T4模板中的reflection。 VS2010中的模板生成器针对Framework 4.0版运行,因此如果您生成3.5或更低版本的代码,则可能会引入不需要的依赖项。

在使用reflection决定是否为各种BCL类型生成ToString参数或参数化调用之后,我刚刚发现了这个问题。 TimeSpan在2.0中只有ToString() ,但是4.0添加了ToString(string) :P

虽然这不能解决锁定问题(虽然我听说过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#>