Он использовал с использованием блока < # + #> вместо использования < # #>. < # + #> блоки являются блоками управления функциями класса и могут содержать только код, который работает внутри класса (т. Е. Свойства/функции/переменные уровня класса). См. 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, и почему это не сработает.
Если вы добавите это перед строкой, вы получите ошибку 'string path = this.Host.ResolvePath (" AssemblyInfo1.cs ");' она показывает ту же ошибку? – rene
с 'this' у него есть проблемы с этим, без' this' это такая же строка ошибок выше, как вы сказали –