生成的C#代码中的T4缩进

时间:2015-11-03 14:05:02

标签: c# t4

当使用T4生成C#代码时,我无法通过散布的TABS获得正确的标识:

public partial class Foo : Base
{
        public int C { get; set; }
        [MappedProperty("A.B[{C}].Foo")]
    public int Foo { get; set; }
}

我正在使用看似正确缩进的.TT代码,类似于以下内容:

public partial class <#= ViewModelName #>
{
    <#  foreach(var property in ViewModelProperties) { #> 
        <# if(property.Mapping != null) { #>
        [MappedProperty("<#= property.Mapping #>")]
        <# } #>
        public <#= property.TypeDeclaration #> <#= property.MemberName #> { get; set; }
    <# } #>
}

此代码段反映了我已尝试过的操作:尽可能将控制语句和块设置为单行。

3 个答案:

答案 0 :(得分:8)

我喜欢这样做,从来没有遇到任何问题。

public partial class <#= ViewModelName #>
{
<#
    foreach(var property in ViewModelProperties) { 
        if(property.Mapping != null) { 
#>
    [MappedProperty("<#= property.Mapping #>")]
<#
        }
#>
    public <#= property.TypeDeclaration #> <#= property.MemberName #> { get; set; }
<#
    }
#>
}

答案 1 :(得分:2)

使用PushIndent()PopIndent()ClearIndent(),如下所示:

SELECT p.app_id, 
 COUNT(CASE WHEN p.active=1 THEN 1 END) AS active_users_count, 
 COUNT(CASE WHEN DATE(p.created_date)= CURDATE() THEN 1 END) AS today_install_count,  
 COUNT(CASE WHEN DATE(p.created_date) = DATE(DATE_SUB(NOW(),INTERVAL 1 DAY)) THEN 1 END) AS     yesterday_install_count,  
 COUNT(CASE WHEN DATE(p.created_date) BETWEEN DATE_SUB(CURDATE(),INTERVAL DAY(LAST_DAY(NOW())) DAY) AND CURDATE() THEN 1 END)         AS month_install_count,  
 COUNT(CASE WHEN DATE(p.created_date) BETWEEN     DATE_SUB(CURDATE(),INTERVAL 1 YEAR) AND CURDATE() THEN 1 END) AS     year_install_count, 
 COUNT(CASE WHEN DATE(p.created_date) BETWEEN     DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND CURDATE() THEN 1 END) AS     week_install_count, 
 COUNT('x') AS total_users_count
 FROM person p 
 INNER JOIN project p2 ON p.app_id = p2.id 
 GROUP BY p.app_id

或者......

public partial class <#= ViewModelName #>
{
<# PushIndent("   "); #>
<#  foreach(var property in ViewModelProperties) { #> 
<# if(property.Mapping != null) { #>
[MappedProperty("<#= property.Mapping #>")]
<# } #>
public <#= property.TypeDeclaration #> <#= property.MemberName #> { get; set; }
<# } #>
<# PopIndent(); #>
}

答案 2 :(得分:1)

你需要对你的空白并不那么凌乱,并且&#39;&lt;#&#39;结果将更加可取:

  1. 你不需要使用&#39;&lt;#&#39;在一半的地方,foreachif可能会保持在一个地方。这样你就可以减少标签之外的潜在空白,使其更具可读性。

  2. 您的public行以双标签开头,因此它会生成一个缩进的属性,其中包含双标签而不是单个标签。删除一个。

  3. 外面的所有空格&#39;&lt;#&#39;标签将被打印,删除它们,只留下标签之外的必要内容(在它们之前和之后)。否则他们会积累并破坏你的格式。