【发布时间】:2009-12-06 22:37:42
【问题描述】:
我有一个包含文本模板的 c# 项目。我希望这个模板能够根据项目中的 C# 类的反射生成一些 SQL。
如何使用 T4 访问当前项目的内容?是否有可能,如果可以,反射是否可用,还是只能访问必须解析的原始源?
提前致谢!
【问题讨论】:
标签: c# .net reflection t4
我有一个包含文本模板的 c# 项目。我希望这个模板能够根据项目中的 C# 类的反射生成一些 SQL。
如何使用 T4 访问当前项目的内容?是否有可能,如果可以,反射是否可用,还是只能访问必须解析的原始源?
提前致谢!
【问题讨论】:
标签: c# .net reflection t4
如何使用 T4 访问当前项目的内容?
一种方法是使用 EnvDTE COM 组件。谷歌搜索 T4 和 EnvDTE 应该会带回大量示例。
有没有可能,如果有,Reflection 是否可用,或者是否可以访问 只是必须解析的原始源?
反射绝对可以从 T4 获得。它的工作原理与您预期的一样。
Oleg Sych 有很多关于常见 T4 使用场景的精彩博客文章,但也有很多其他关于 T4 的资源。
【讨论】:
除了锁定问题之外,还要小心在 T4 模板中使用反射。 VS2010 中的模板生成器针对 4.0 版本的框架运行,因此如果您为 3.5 或更低版本生成代码,则可能会引入不需要的依赖项。
在使用反射来决定是否为各种 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#>
【讨论】: