基于当前项目生成代码的T4模板

本文关键字:T4 模板 代码 于当前 项目 | 更新日期: 2023-09-27 18:10:46

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

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

然后我可以从t4模板文件加载程序集并找到类并迭代测试属性并生成一个带有基于列表的属性的类的.cs文件吗?

预期输出。

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

基于当前项目生成代码的T4模板

我有一个TemplateManager。包含一些可重用逻辑的文件。这个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
#>