你如何使用.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#>