如何让VS2010中的T4迭代类的属性

时间:2010-07-14 15:58:19

标签: asp.net-mvc t4

我正在使用Visual Studio 2010,并安装了有形的T4EditorPlusModellingTools。

我只是在玩T4,从未接触过它。我想做的是查看项目中的一个类,并写出每个属性。

有人能给我一些绝对的初学者提示,了解.tt文件应该如何构建?我用谷歌搜索了这个并没有找到答案,所以任何帮助都会受到赞赏。

感谢。

3 个答案:

答案 0 :(得分:6)

在标签中使用反射。

类似的东西:

<#foreach (PropertyInfo info in myObject.GetType().GetProperties()){#>
    // do what you want with or any other property of info <#=info.Name#>
<#}#>

尝试这里的tuturials msdn

<#@ template debug="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="System.Xml"#>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Reflection" #>

<#
XmlDocument doc = new XmlDocument();
foreach (PropertyInfo info in doc.GetType().GetProperties()){#>
    <#=info.Name#>
<#}#> 

将打印xmldocument的所有属性

答案 1 :(得分:4)

如果您反映的程序集是项目的一部分(正如提到的原始提问者那样),那么您将体验到所提到的锁定。

作为Oleg Sych的T4Toolbox codeplex项目(http://t4toolbox.codeplex.com/)的一部分,有一个临时解决方案,它提供了一个新的VolatileAssembly指令,可以在加载之前复制该程序集。

我们目前正在努力尽快在核心T4引擎中解决此问题。

但是,如果你想使用项目中的代码,你可能不想处理已编译的程序集,而是处理磁盘上的源代码,在这种情况下,VS中的CodeModel是另一种选择(如果你能活下去的话)模板仅在设计时在VS内部运行。)

http://www.olegsych.com/2008/07/t4-template-for-generating-sql-view-from-csharp-enumeration/

就是一个例子

答案 2 :(得分:3)

这真的很难,因为T4模板和反射不能很好地协同工作。

请在此处查看我对类似的,可能重复的问题的回答:

Generate columnheaders based on the DisplayName attribute?

<强>更新

我不需要检查我的答案,我走了这条路,发现反射+ t4模板有问题。另一个回答者提供的平庸的例子并没有反映提问者试图完成的任务的真正复杂性。尝试使用更真实的反射目标,如自定义代码,而不是.NET类。

之所以在我提供的链接中清楚地解释了原因,但由于在阅读链接之前我更容易投票,我会在此发布:

“访问.NET元数据的首要选择是反射。这个API内置于.NET基类库中,提供对.NET类型元数据的访问。不幸的是,Reflection针对代码执行进行了优化。一个特殊限制使它不适合代码生成 - 使用Reflection加载的程序集只能通过其AppDomain卸载。因为T4模板被编译成.NET程序集并缓存以提高代码生成的性能,使用Reflection访问组件程序集会导致T4锁定它。这可以防止你更改/重新编译组件,直到你关闭并重新打开解决方案。虽然你可以忍受这种烦恼,但最好还是避免它。“