Mono.TextTemplating.Roslyn T4传递参数

Mono.TextTemplating.Roslyn T4 pass parameter

我想将值/参数传递给 .tt 文件。在本例中,它是 'ClassName'。 要生成 class,使用 Mono.TextTemplating.Roslyn NuGet 包和 .NET 6.

一执行.tt,就会显示下一个错误:

System.ArgumentNullException: Value cannot be null. (Parameter 'objectToConvert')

两个 'Add' 函数都没有产生预期的行为:

session.Add("ClassName", "ABC");
generator.AddParameter(null, null, "ClassName", "ABC");

传递值并在 .tt 中使用它的正确方法是什么。

.tt文件

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Xml" #>
<#@ output extension=".cs" #>
//----------------------------------------------------
//
// THIS IS AN AUTO GENERATED FILE.
//
//----------------------------------------------------

using System;

namespace ConsoleApp1
{
    public class <#= ClassName #>
    {
            
    }
}
<#+
public string ClassName { get; set; }
#>

tt执行:

string inputFile = @"C:\MyClass2.tt";
string outputFile = @"C:\ClassA2.cs";
var generator = new Mono.TextTemplating.TemplateGenerator();
var session = generator.GetOrCreateSession();

session.Add("ClassName", "ABC"); // does NOT work    
generator.AddParameter(null, null, "ClassName", "ABC"); // does NOT work

generator.ProcessTemplate(inputFile, outputFile); 

参数未作为变量公开,它们旨在作为自定义指令处理器的参数。要直接从代码访问,您必须设置 hostspecific="true" 并通过 Host.ResolveParameterValue (paramName).

访问

*.tt 文件:

<#@ template language="C#" hostspecific="true" #>
<# string temp = this.Host.ResolveParameterValue("", "", "foo");#>
string inputFile = @"D:\Project\App\MyClass2.tt";
string outputFile = @"D:\Project\App\ClassA2.cs";
var generator = new Mono.TextTemplating.TemplateGenerator();
var session = generator.GetOrCreateSession();

session.Add("ClassName", "TTT");
generator.AddParameter(null, null, "ClassName", "TTT");

generator.ProcessTemplate(inputFile, outputFile);

hostspecific="true"属性添加到模板元素如下:
MyClass2.tt :

<#@ output extension=".cs" #>
<#@ template language="C#" hostspecific="true" #>
<# string Myclass = this.Host.ResolveParameterValue("", "", "ClassName");#>

using System;

namespace ConsoleApp1
{
    public class <#= Myclass #>
    {
            
    }
}

输出ClassA2.cs

using System;

namespace ConsoleApp1
{
    public class TTT
    {
            
    }
}