T4 - 错误60:甲字段初始不能引用非静态字段,方法或属性(T4 - Error 60: A f

2019-10-29 21:25发布

我试着用从溶液微软的文档 。

在我的开始.tt文件,我把:

<#@ template language="C#" hostSpecific="True" #>
<#@ output extension="cs" #>
<#@ import namespace="System.IO" #>

然后我试着从我previosly转换文件中的一些变量:

<#+
    string myFile = File.ReadAllText(Host.ResolvePath("AssemblyInfo1.cs"));
#>

在上面的线,我得到的错误。 如果该行被注释掉一切正常。 错误输出:

错误60:甲字段初始不能引用非静态字段,方法或属性

Answer 1:

它已经做与使用<#+#>块,而不是使用一个<##>。 <#+#>块是类功能控制块,并且只能包含一类(即性质/功能/类级别的变量)内的工作码。 查看MS文档关于如何工作的详细信息,但基本上是在执行您的模板转化为一类,而在另一个应用程序域执行和结果的文本保存到一个文件中。 基本上你的代码是试图做的是访问类的局部变量在这样的初始化语句:

public class T4GeneratedClass 
{
    public object Host { get; set; }

    private string myFile = File.ReadAllText(this.Host.ResolvePath("AssemblyInfo1.cs"));
}

这不是有效的代码,=后面的语句是尝试设置值“MYFILE”用它在被定义同一类的属性(this.Host)。“File.ReadAllText”是确定的,因为这是一个静态的功能,而不是同一类的一部分。

给出其他答案应该工作,因为他们正在创建的类,然后从这些功能的“主机”属性(this.Host)可在身体的新功能。

为您的代码为是工作,从<#+#>控制块类型更改为<##>。 这将在主函数创建“MYFILE”变量,它将有机会获得“主机”属性。

如果您想了解更多关于T4是如何工作的,你可以下载我的分机 ,我有一个功能(它的社区版,所以你可以免费使用它的一部分),将显示你已生成并通过T4使用的实际类框架,它应该帮助阐明什么T4在做什么,为什么这是行不通的一些情况。



Answer 2:

OK,这是一个例子:

主模板

<#@ template language="C#" #>
<#@ import namespace="System.Runtime.Remoting.Messaging" #>
public class <#= ClassName #>
{
    public string Property
    {
        get { return _property; }
        set { _property = value; }
    }
}
<#+
    string ClassName
    {
        get { return (string)CallContext.LogicalGetData("ClassName"); }
    }
#>

调用模板

<#@ template language="C#" hostspecific="True" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Runtime.Remoting.Messaging" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#
  CallContext.LogicalSetData("ClassName", "TestClass");
  string output = ProcessTemplate("Template.tt");
  Write(output);
#>
<#+
  string ProcessTemplate(string templateFileName)
  {
    string template = File.ReadAllText(Host.ResolvePath(templateFileName));
    Engine engine = new Engine();
    return engine.ProcessTemplate(template, Host);
  }
#>

产量

public class TestClass
{
    public string Property
    {
        get { return _property; }
        set { _property = value; }
    }
}

它是如何工作的主模板定义其参数为只读属性从远程CallContext中得到他们的价值观,比如在上面的例子className属性。 该调用模板,将它们放置在CallContext中提供的参数值。 然后使用T4引擎编译和执行主要的模板,并保存其输出。 优点独立模板技术允许参数一次性模板并重复使用以产生相同类型的多个工件。 这种技术提供的主模板的很好的封装,并且允许构成模板来生成从一个单一的呼叫模板多个输出。 这种技术可以用于调用外部代码,T4模板诸如控制台应用程序。

缺点独立模板技术需要使用外部,弱类型机构,例如CallContext中或XML文件,以参数值传递到主模板。

这种技术不允许而不诉诸主模板本身的修改延长主模板。

关于T4 T4(文本模板转换工具包)是一个基于模板的代码生成引擎。 它可以在Visual Studio 2008,并在DSL下载和GAT工具包Visual Studio 2005的T4引擎允许你使用ASP.NET类模板语法生成C#,T-SQL,XML或任何其他文本文件。



文章来源: T4 - Error 60: A field initializer cannot reference the non-static field, method, or property