Текстовые шаблоны для генерации строк во время выполнения (например, Razor или T4) - PullRequest
7 голосов
/ 11 октября 2011

Есть ли в сети какой-либо инструмент, который можно использовать для генерации строк из шаблона, я ищу что-то похожее на Razor.

Строки должны быть сгенерированы во время выполнения, ине зависит от Visual Studio (например, T4).И фреймворк должен работать в Silverlight.

RazorEngine - это фреймворк, который отвечает требованиям, но не работает в Silverlight.

Заранее спасибо.

1 Ответ

6 голосов
/ 11 октября 2011

Надеюсь, я понял, что вы просили, но я бы сказал, что вы можете заставить T4 работать и в SL.T4 можно попросить сгенерировать то, что иногда называют шаблонами времени выполнения.Я определил свой шаблон (очень простой) и добавил его в свой проект Silverlight.

<#
    for (var iter = 0; iter < 10; ++iter)
    {
#>
    This is just a test: #<#=iter#>
<#
    }
#>

Обычно он генерирует такой вывод:

This is just a test: #0
This is just a test: #1
This is just a test: #2
This is just a test: #3
This is just a test: #4
This is just a test: #5
This is just a test: #6
This is just a test: #7
This is just a test: #8
This is just a test: #9

Но в этом случае мне нравитсягенерировать код, который генерирует этот вывод, т.е. шаблон времени выполнения.Для этого я переключаю пользовательский инструмент на: TextTemplatingFilePreprocessor

Теперь шаблон генерирует код, который генерирует этот вывод.Если не указывать hostspecific = true, вы не получите зависимости Visual Studio.Расширяя частичный класс переменными-членами и ссылаясь на них из файла шаблона, вы можете изменить поведение шаблона во время выполнения.

Проблема в Silverlight заключается в том, что в Silverlight отсутствуют классы: System.CodeDom.Compiler.CompilerErrorи System.CodeDom.Compiler.CompilerErrorCollection.

Я работал над этим, создавая собственные классы для этого (только для этой цели):

namespace System.CodeDom.Compiler
{
    public class CompilerError
    {
        public string ErrorText;
        public bool IsWarning;
    }

    public class CompilerErrorCollection : List<CompilerError>
    {

    }

}

Теперь мой шаблон компилируется, и я простонапример, из моего приложения Silverlight для вывода:

var runtimeTemplate = new MyRuntimeTemplate();
string output = runtimeTemplate.TransformText();
...