2015-11-11 8 views
4

Я пытаюсь написать класс в шаблоне T4, который использует Text Template Utility Methods (например, WriteLine, PushIndent, PopIndent). Однако, если я пытаюсь вызвать эти методы в моем классе, я получаю ошибку компиляции, указавПочему я не могу получить доступ к утилитам в классах в шаблонах T4?

Compiling преобразования: Не удается получить доступ к нестатический члену внешнего типа «Microsoft.VisualStudio.TextTemplating.TextTransformation» с помощью вложенного типа '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 
    } 
} 
#> 

Есть ли способ получить доступ к этим методам утилиты в пределах класса или мне нужно использовать бесплатные функции?

(я бегу на Visual Studio 2015 Community)

+2

Полезные методы, такие как 'WriteLine', являются ** экземплярами ** методов класса шаблона, поэтому вам нужна ссылка на экземпляр шаблона для их вызова. – PetSerAl

+0

@PetSerAl Спасибо за информацию - не могли бы вы также рассказать мне, как я могу получить такой экземпляр? Я знаю класс TextTransformation, но он абстрактный и не имеет шаблона Singleton. – feO2x

+1

Экземпляр «TextTransformation» доступен как 'this' в любом экземпляре метода шаблона, например' FunctionSample' в вашем примере. Вот почему они могут вызывать утилиты. – PetSerAl

ответ

4

Как PetSerAl указывалось в комментариях, вы можете просто вызвать методы T4 Utility в любой «свободной функции» в классе Feature блока управления, потому что они унаследованные от базового класса TextTransformation, то есть эти свободные функции не являются абсолютно свободными, они являются методами в рамках неявно созданного класса, который происходит от TextTransformation. Вот почему вы можете получить доступ к this в этих функциях.

Так что если вы хотите использовать метод утилиты в другом классе, который вы определили в шаблоне T4 (этот класс на самом деле является вложенным дочерним классом), вам необходимо передать ссылку 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.