T4模板根据当前项目生成代码

时间:2014-06-29 13:42:37

标签: c# t4

在visual studio的当前项目中,我将有一个看起来像这样的类

public class DbContextBuilderFactory
{
    public List<String> Test { get { return new List<string>{ "adsa", "adas"};} }
}

然后,我可以从t4模板文件加载程序集并找到该类并迭代Test属性并根据列表生成带有类机智属性的.cs文件吗?

预期产出。

public class OutPutClass
{
    public int adsa{get;set;}
    public int adas{get;set;}
}

1 个答案:

答案 0 :(得分:0)

我有一个TemplateManager.tt文件,其中包含一些可重用的逻辑。此tt文件的内部几乎与任何.cs文件相同:

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Namespace.With.DbContextBuilderFactory" #>

<#+
// Keep code you want to reuse in a separate tt file
public class TemplateManager
{
  // properties
  // parse DbContextBuilderFactory
  public static IEnumerable<string> ParseDbContextBuilderFactory()
  {
    DbContextBuilderFactory dbf= new DbContextBuilderFactory();
    return dbf.Tests;
  }
}

然后在主t4模板中

<#@ template language="C#" debug="true" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude.tt"#>
<#@ include file="TemplateManager.tt"#>
<#@import namespace="System.Data.Entity.Design.PluralizationServices" #>
<#
    // preamble
    List<Values> values = TemplateManager.ParseDbContextBuilderFactory();   
    WriteOutput(code, values, namespaceName);
    FileManager.Process(); // or something
#>
<#+
//_=_
public void WriteOutput(CodeGenerationTools code, List<string> values, string namespaceName)
{
PopIndent();
#>
namespace <#=code.Escape(namespaceName)#>
{
    public class OutPutClass
    {
        <#+
        foreach (var value in values)
        {
        #>
        public int <#=code.Escape(value)#> {get; set; }
        <#
        } // foreach
        #>
    }
}
<#
} // WriteOutput
#>