【问题标题】:How do I generate a code block in a T4 template from nested template blocks?如何从嵌套模板块生成 T4 模板中的代码块?
【发布时间】:2012-09-06 21:42:55
【问题描述】:

我在我的代码块中动态创建类和变量名例如:

if (new<#=et.Name#> == null)

对于名为 Site 的实体模型,这会生成:

 if (newSite == null)

但我想做的是评估项目的类型,然后根据该类型生成代码。出于我的特定目的,我想编写一个代码块,根据该实体的键值的数据类型动态创建一个新的主键。所以我想在我的模板中做这样的事情:

<#if ( new<#=et.Name#>.<#=primaryKey.Name#>.GetType() == typeof( Guid ) ) {#>
   if (new<#=et.Name#>.<#=primaryKey.Name#> == Guid.Empty )
      new<#=et.Name#>.<#=primaryKey.Name#> = Guid.NewGuid();
<#} #>

随后为名为 Site 的实体模型生成的代码如下所示:

if ( newSite.SiteKey == Guid.Empty )
   newSite.SiteKey = Guid.NewGuid();

这在逻辑上看起来好像可行。但是,我无法找到正确的语法来嵌套模板块并评估这些值然后放置在条件中。注意嵌套在语句块中的表达式块。因此,上面的代码生成示例不起作用,因为 Visual Studio 抱怨各种语法问题。

想法?

【问题讨论】:

  • 这不太可能奏效。原因之一是模板可用的类型不一定可用于生成的代码,反之亦然。更好的是,如果您对对象进行建模并公开像 IsPrimaryKey 这样的属性,然后您可以在模板中对其进行测试。意图也更清晰。

标签: visual-studio-2010 dynamic code-generation t4


【解决方案1】:

如果类型在您正在构建的程序集中,您可以使用

<#@ assembly name="$(TargetPath)"#>

我在View Gen T4 templates for Code First中使用了这个技巧

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2010-12-26
    • 1970-01-01
    • 2014-07-14
    • 2013-04-26
    相关资源
    最近更新 更多