Механизм шаблонов С#

Я ищу автономный, простой в использовании код С#, механизм шаблонов. Я хочу создать файлы HTML и XML с заполнителями для данных, и заполнить их данными из моего кода.

Механизм должен поддерживать циклы (дублирующие части шаблона, содержащие больше одного объекта) и условия (добавить части шаблона в конечный HTML/XML, только если некоторые условия верны). Может ли кто-то рекомендовать мне хороший вариант и добавить ссылку на более или менее такой пример кода и некоторую документацию о том, как использовать рекомендуемый компонент для моих нужд?

Мне также нужно использовать циклы для дублирования строк таблицы или даже целых таблиц (в версии HTML) и сложных элементов (в версии XML).

Ответ 4

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

Синтаксис очень похож на String.Format, и он очень прост и прост в освоении и использовании. Вот пример синтаксиса из документации:

Smart.Format("{Name} friends: {Friends:{Name}|, |, and}", user)
// Result: "Scott friends: Michael, Jim, Pam, and Dwight"

Библиотека с открытым исходным кодом и легко расширяемая, поэтому вы также можете улучшить ее с помощью дополнительных функций.

Ответ 5

Вы посмотрели XSLT? Вам нужно будет начать с вашего исходного формата данных в XML, возможно, путем xmlserializing ваших объектов данных. Вы можете сделать циклы и если утверждения с легкостью!

Кэтлин Доллард книга по генерации кода через XSLT.

Лично я большой поклонник T4 (особенно при создании С#), но вы можете обнаружить, что, поскольку XML и HTML являются ваши типы выпуска XSLT вы покрыли. Плюс это очень кросс-платформенный.

Ответ 6

У меня есть механизм шаблонов, встроенный в мою библиотеку классов, которая выглядит и работает аналогично ASP в старом стиле или T4.

Вы в основном пишете код С# в блоках <%% > и, таким образом, можете делать большинство вещей, которые может выполнять С#, с ограничением, что весь файл шаблона скомпилирован для одного метода. Другими словами, вы не можете определять вспомогательные классы и такие внутри шаблона, но для вспомогательных методов вы можете делать анонимные методы.

Пример:

<%
    var firstname = "Bob";
    var count = 10;

    for (Int32 index = 0; index < count; index++)
    {
%>
<%= firstname %> x <%= index+1 %>/<%= count %>
<%
    }
%>

Затем он будет скомпилирован в класс С# в другом appdomain и может быть выполнен для возврата строки, содержащей полученный текст.

Вы также можете передать аргумент в шаблон, а также библиотеки ссылочных классов, что означает, что вы можете передавать пользовательские структуры данных или получать доступ к уровню доступа к данным или коду бизнес-логики из вашего шаблона.

Если вы хотите посмотреть на него, код доступен в моей библиотеке классов из моего репозитория Subversion или веб-страницы:

Для репозитариев subversion вам нужно имя пользователя и пароль, оба являются "гостями", без кавычек.

Код находится в проекте/сборке LVK.Text.Templating.

Также дайте мне знать (см. электронную почту на странице профиля или оставьте комментарий), и я приведу вам еще несколько примеров.

Ответ 7

Вам может понадобиться .NET Template Engine.

Код шаблона:

$Book.StaticId$

ID: $bk.BookId$ - Author: $bk.Author.Name$

Length of the author Name: $bk.Author.Name.Length$

Код С#:

class Author
   {
       public string Name
       {
           get
           {
               return "John Borders";
           }
       }
   }
   class Book
   {
       public static string StaticId
       {
           get
           {
               return "AABB";
           }
       }
       public int BookId
       {
           get
           {
               return 100;
           }
       }
       public Author Author
       {
           get
           {
               return new Author();
           }
       }
   }
   public class PropertySample1
   {
       [STAThread]
       static void Main()
       {
           TemplateEngine dt = new TemplateEngine();
           dt.LoadFromFile("Template.tpl");
           Book book = new Book();
           dt.SetValue("bk", book);
           dt.UsingNamespace("CSharp,Demo");
           string output = dt.Run();
           Console.WriteLine(output);
       }
   }

Выход:

AABB

ID: 100 - Author: John Borders

12