У меня есть аналогичный набор классов, который я использую для этого, встраивая шаблонное генерирование текста в программное обеспечение.
По сути, он работает как старый стиль ASP, вы окружаете код C # блоками <%...%>
и можете выдавать результаты, используя <%= expression %>
.
Вы можете передать один объект в код шаблона, который, конечно, может быть любым типом объекта или просто массивом параметров. Вы также можете ссылаться на свои собственные сборки, если хотите выполнить пользовательский код.
Вот как будет выглядеть класс:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Конечно, вы можете перебирать вещи:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
и поместить код в if-блоки и т. Д.
Библиотека классов выпущена на CodePlex здесь:
а также на NuGet .
Проект поставляется с примерами, скачайте исходный код или просмотрите его онлайн .
Чтобы ответить на вопросы по электронной почте также здесь, чтобы другие могли видеть:
- Все типы кода C # , которые вписываются в вызов метода , могут быть скомпилированы в шаблоне. Он запускает нормальный код C # 3.5 со всем, что означает, что нет никаких искусственных ограничений. Единственное, что нужно знать, так это то, что любой, если, хотя, for, foreach и т. Д. Код, содержащий код шаблона для отправки, должен использовать фигурные скобки, вы не можете сделать однострочный блок типа if-then. Ниже приведено описание ограничения вызова метода.
- Параметр
data
соответствует тому, что было передано в качестве параметра методу .Generate(x)
из вашего приложения, и относится к тому же типу. Если вы передаете объект, который вы определили в своих собственных библиотеках классов, вам нужно добавить ссылку на код шаблона для правильного доступа к нему. (<%@ reference your.class.library.dll %>
)
- Если вы повторно используете скомпилированный шаблон, по сути это будет только вызов метода для класса, никаких дополнительных накладных расходов на фактический вызов
.Generate()
не производится. Если вы не позвоните .Compile()
самостоятельно, об этом позаботится первый звонок .Generate()
. Также обратите внимание, что код выполняется в отдельном домене приложения, поэтому есть небольшая накладная нагрузка, связанная с копированием параметра и результатом туда и обратно. Однако код выполняется с нормальной скоростью кода JITted .NET.
Пример блока if:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
Также нет никаких искусственных ограничений на форматирование кода, выберите стиль, который вам больше подходит:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
Только обратите внимание, что все некодовые части шаблона будут выводиться как есть, что означает вкладки и такие последующие %>
блоки, которые также будут выводиться.
Существует одно ограничение: весь код, который вы пишете, должен помещаться внутри одного вызова метода.
Позвольте мне объяснить.
Механизм работы шаблонов заключается в том, что он создает файл .cs и передает его компилятору C #, этот файл .cs примерно выглядит так:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Это означает, что вы не можете определять новые классы, новые методы, поля уровня класса и т. Д.
Однако вы можете использовать анонимных делегатов для внутреннего создания функций. Например, если вы хотите единообразный способ форматирования дат:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
тогда вы можете просто использовать это в оставшейся части кода шаблона:
<%= date2str(DateTime.Now) %>
Единственное требование, которое у меня есть, это то, что вы не загружаете файлы в Интернет и не утверждаете, что написали код, кроме того, что вы можете делать с ним все, что хотите.
Редактировать 23.04.2011: Исправлены ссылки на проект CodePlex.