2015-01-15 6 views
0

Я пытаюсь использовать решение от Microsoft documentation.T4 - Ошибка 60: Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство

В начале моего .tt файла, который я поставил:

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

Тогда я пытаюсь получить некоторые переменные из моего previosly преобразованного файла:

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

В строке выше я получаю сообщение об ошибке. Если строка прокомментирована, все в порядке. выхода Ошибки:

Ошибка 60: Поле инициализатор не может ссылаться на нестатическое поле, метод или свойство

+0

Если вы добавите это перед строкой, вы получите ошибку 'string path = this.Host.ResolvePath (" AssemblyInfo1.cs ");' она показывает ту же ошибку? – rene

+0

с 'this' у него есть проблемы с этим, без' this' это такая же строка ошибок выше, как вы сказали –

ответ

1

Он использовал с использованием блока < # + #> вместо использования < # #>. < # + #> блоки являются блоками управления функциями класса и могут содержать только код, который работает внутри класса (т. Е. Свойства/функции/переменные уровня класса). См. MS docs для получения дополнительной информации о том, как это работает, но в основном при выполнении ваш шаблон преобразуется в класс и выполняется в другом домене приложения, а результаты в виде текста сохраняются в файле.По сути то, что ваш код пытается сделать доступ к локальной переменной класса в операторе инициализации, как это:

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

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

Это не правильный код, заявление после того, как = является пытается установить значение «Myfile» используя свойство (this.Host) в том же классе, в котором он определяется. «File.ReadAllText» - это нормально, потому что это статическая функция, а не часть того же класса.

Другие ответы, данные должны работать, потому что они создают новые функции в классе и из тела этих функций доступно свойство «Host» (this.Host).

Для того чтобы ваш код работал как есть, измените тип блока управления с < # + #> на < # #>. Это создаст вашу переменную «myFile» в главной функции и будет иметь доступ к свойству «Хост».

Если вы хотите больше узнать о том, как работает T4, вы можете скачать my extension, у меня есть функция (ее часть версии сообщества, чтобы вы могли ее использовать бесплатно), которая покажет вам действительно класс, который сгенерирован и используется в рамках T4, это должно помочь пролить свет на то, что делает T4, и почему это не сработает.

+0

спасибо за прояснение и решение :) –

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 Engine для компиляции и выполнения основного шаблона и сохранения его вывода. Достоинства Метод автономного шаблона позволяет параметризовать одноразовый шаблон и повторно использовать его для создания нескольких артефактов того же типа. Этот метод обеспечивает хорошую инкапсуляцию основного шаблона и позволяет составлять шаблоны для генерации нескольких выходов из одного шаблона вызова. Этот метод можно использовать для вызова шаблона T4 из внешнего кода, например консольного приложения.

Противоречия Для автономной техники шаблонов требуется использование внешнего, слабо типизированного механизма, такого как CallContext или XML-файл, для передачи значений параметров в основной шаблон.

Этот метод не позволяет расширить основной шаблон, не прибегая к модификации самого основного шаблона.

О T4 T4 (Инструментарий преобразования текстовых шаблонов) - это механизм генерации кода на основе шаблонов. Он доступен в Visual Studio 2008 и в качестве загрузки в наборах DSL и GAT для Visual Studio 2005. Механизм T4 позволяет использовать синтаксис шаблонов ASP.NET для генерации C#, T-SQL, XML или любых других текстовых файлов.

+0

. Вы должны попытаться расширить этот ответ с дополнительной информацией. Попробуйте объяснить, как это отвечает на вопрос. – AeroX

+0

Добавьте больше информации в свой ответ. – arulmr

+0

Это не точный ответ на проблему, но я вижу, что вы новичок на stackoverflow.com, поэтому, пожалуйста, прочитайте страницы тура и помощи, чтобы ваши сообщения стали лучше. Это позволит вам собрать больше очков и дать вам возможность задать свои вопросы :) –

Смежные вопросы

 Смежные вопросы