Это проблема, с которой я изо всех сил пытался решить какое-то время. Мне нужен способ заменить код в методе анализируемым кодом из шаблона во время компиляции (PostSharp приходит на ум) или создать динамический прокси (Linfu или Castle). Поэтому, учитывая исходный код, как этотКак перехватывать, анализировать и компилировать?
[Template]
private string GetSomething()
{
var template = [%=Customer.Name%]
}
мне это нужно, чтобы быть скомпилированы в этой
private string GetSomething()
{
MemoryStream mStream = new MemoryStream();
StreamWriter writer = new StreamWriter(mStream,System.Text.Encoding.UTF8);
writer.Write(@"");
writer.Write(Customer.Name);
StreamReader sr = new StreamReader(mStream);
writer.Flush();
mStream.Position = 0;
return sr.ReadToEnd();
}
Это не важно, какая технология используется. Я пробовал использовать метод PostMark, но не получил нигде (из-за отсутствия опыта работы с ним). Я также изучил структуру Linfu. Может кто-нибудь предложить другой подход или способ сделать это, я бы очень признателен. От этого зависит весь мой проект.
Предположения:
- код может появиться в любом классе.
- Код шаблона всегда будет аннотирован с атрибутом [Template]
- Метод шаблона всегда будет возвращать строку.
Разбор кода из одной формы в другую уже выполнен. Теперь мне просто нужен способ заменить его.
пример "Beefer":
[Test]
public void can_parse_csharp_code_template3()
{
var template = @"<template> [%= GetUsing() %]
namespace [%= GetModelNamespaceName(.metaPackage) %]
{
[%= .visibility.ToString().ToLower() %] class [%= .Name %] : INotifyPropertyChanged [%= If(.IsPersistent, "", PersistenObject"", """") %]
{
#region Constructors
[%= ConstructorTemplate.Create(metaObject).GetParameterlessConstructorCode %]
#endregion
#region Attributes
[%= From attribute In metaObject.attributes _
Select (AttributeTemplate.Create(attribute).GetSourceCode) %]
#endregion
#region Relationships
[%= From relationship As Relationship In metaObject.relationships _
Select (RelationshipTemplateFactory.CreateFor(relationship).GetSourceCode()) %]
#endregion
#region Methods
[%= From operation In metaObject.operations _
Select (MethodTemplate.Create(operation).GetSourceCode) %]
#endregion
#region ""INotifyPropertyChanged""
[%= GetOnPropertyChanged() %]
#endregion
}
}</template>";
Console.WriteLine(TemplateParser.GetParsedResult(template));
}
В чем смысл этого делать в первую очередь? –
@Matti: Это не соответствует точке. Я не могу вдаваться в подробности, почему это необходимо. – epitka
Ваш шаблон существенно сводится к 'return Customer.Name;', что делает использование шаблонов несколько глупым. Поэтому, спрашивая, нужны ли шаблоны вообще, является актуальным вопросом ИМО. – dtb