これは私がしばらく解決するのに苦労してきた問題です。メソッド内のコードをコンパイル時にテンプレートから解析されたコードに置き換えるか(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();
}
どのテクノロジーを使用するかは重要ではありません。PostSharpのImplementMethodAspectを試してみましたが、どこにも行きませんでした(経験不足のため)。Linfuフレームワークも調べました。誰かがこれを行うための他のアプローチや方法を提案できますか、私は本当に感謝します。私のプロジェクト全体はこれに依存しています。
仮定:
- コードはどのクラスにも表示できます。
- テンプレートコードには常に属性[テンプレート]の注釈が付けられます
- テンプレートメソッドは常に文字列を返します。
あるフォームから別のフォームへのコードの解析はすでに完了しています。今、私はそれを交換する方法が必要です。
「ビーファー」の例:
[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));
}