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
{
}
}
我想将值/参数传递给 .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
{
}
}