为什么我无法访问 T4 模板中 class 成员中的实用程序方法?
Why can't I access the utility methods in class members in T4 templates?
我正在尝试在使用 Text Template Utility Methods(如 WriteLine、PushIndent、PopIndent)的 T4 模板中编写 class。但是,如果我尝试在我的 class 中调用这些方法,我将收到一个编译器错误,指出
Compiling transformation: Cannot access a non-static member of outer
type 'Microsoft.VisualStudio.TextTemplating.TextTransformation' via
nested type
'Microsoft.VisualStudio.TextTemplatingBF13B4A5FBA992E5EF81A8A7A4EACCAC3F7698E169D0F7825ED4F22A28C7C52C2B766D83F4C5ACA13E0DE0B3152B6D966E34EB8C5FC677E145F55BE0485406EC.GeneratedTextTransformation.ClassGenerator'
一个 MCVE(最小的完整可验证示例)如下所示:
<#+
public void FunctionSample()
{
WriteLine("Hello"); // This works fine
}
public class SampleClass
{
public static void StaticMethodSample()
{
WriteLine("Hello"); // This does not compile
}
public void InstanceMethodSample()
{
WriteLine("Hello"); // This does not compile either
}
}
#>
有什么方法可以在 class 范围内访问这些实用方法,还是我必须使用免费函数?
(我 运行 在 Visual Studio 2015 社区)
正如 PetSerAl 在评论中指出的那样,您可以在 Class 功能控制块中的任何 "free function" 中调用 T4 实用程序方法,因为它们继承自 TextTransformation
base class,即这些自由函数并不是完全自由的,它们是从 TextTransformation
派生的隐式创建的 class 范围内的方法。这就是为什么您还可以在这些函数中访问 this
。
所以如果你想在你在T4模板中定义的另一个class中使用一个实用方法(这个class实际上是一个嵌套的子class),你必须通过在对它的 TextTransformation 的引用中,例如像这样:
<#
var @object = new SampleClass(this); // Pass 'this' (TextTransformation) to the constructor
@object.SayHello();
#>
<#+
public class SampleClass // This is actually a nested child class in T4 templates
{
private readonly TextTransformation _writer;
public SampleClass(TextTransformation writer)
{
if (writer == null) throw new ArgumentNullException("writer");
_writer = writer;
}
public void SayHello()
{
_writer.WriteLine("Hello");
}
}
#>
可以在 MSDN library 中找到更多信息。
我正在尝试在使用 Text Template Utility Methods(如 WriteLine、PushIndent、PopIndent)的 T4 模板中编写 class。但是,如果我尝试在我的 class 中调用这些方法,我将收到一个编译器错误,指出
Compiling transformation: Cannot access a non-static member of outer type 'Microsoft.VisualStudio.TextTemplating.TextTransformation' via nested type 'Microsoft.VisualStudio.TextTemplatingBF13B4A5FBA992E5EF81A8A7A4EACCAC3F7698E169D0F7825ED4F22A28C7C52C2B766D83F4C5ACA13E0DE0B3152B6D966E34EB8C5FC677E145F55BE0485406EC.GeneratedTextTransformation.ClassGenerator'
一个 MCVE(最小的完整可验证示例)如下所示:
<#+
public void FunctionSample()
{
WriteLine("Hello"); // This works fine
}
public class SampleClass
{
public static void StaticMethodSample()
{
WriteLine("Hello"); // This does not compile
}
public void InstanceMethodSample()
{
WriteLine("Hello"); // This does not compile either
}
}
#>
有什么方法可以在 class 范围内访问这些实用方法,还是我必须使用免费函数?
(我 运行 在 Visual Studio 2015 社区)
正如 PetSerAl 在评论中指出的那样,您可以在 Class 功能控制块中的任何 "free function" 中调用 T4 实用程序方法,因为它们继承自 TextTransformation
base class,即这些自由函数并不是完全自由的,它们是从 TextTransformation
派生的隐式创建的 class 范围内的方法。这就是为什么您还可以在这些函数中访问 this
。
所以如果你想在你在T4模板中定义的另一个class中使用一个实用方法(这个class实际上是一个嵌套的子class),你必须通过在对它的 TextTransformation 的引用中,例如像这样:
<#
var @object = new SampleClass(this); // Pass 'this' (TextTransformation) to the constructor
@object.SayHello();
#>
<#+
public class SampleClass // This is actually a nested child class in T4 templates
{
private readonly TextTransformation _writer;
public SampleClass(TextTransformation writer)
{
if (writer == null) throw new ArgumentNullException("writer");
_writer = writer;
}
public void SayHello()
{
_writer.WriteLine("Hello");
}
}
#>
可以在 MSDN library 中找到更多信息。