私はT4で手を出し始めて、最初はかなりうまくいきましたが、実際にはかなり明白で解決できないかもしれない問題に遭遇しましたが、私が知ることや見ることの経験が不足している方法があるかもしれません。
次のクラスがあるとします。
public class T4Test : CodeActivity
{
protected override void Execute(CodeActivityContext context)
{
}
[Input("InX")]
public InArgument<string> InX { get; set; }
[Output("OutX")]
public OutArgument<string> OutX { get; set; }
}
私はこれを出力として欲しい:
public class ActivityWrapper
{
private readonly T4Test _activity;
private readonly ActivityContext _context;
public ActivityWrapper(T4Test activity, ActivityContext context)
{
this._activity = activity;
this._context = context;
}
public string InX
{
get { return this._activity.InX.Get(this._context); }
}
public string OutX
{
get { return this._activity.OutX.Get(this._context); }
set { this._activity.OutX.Set(this._context, value); }
}
}
私は必要なReflectionのものを理解し、T4コードがどのように見えるかを知っていますが、1つの問題があります。それは、T4Test
クラスと同じプロジェクトで必要です。ただし、アセンブリをロードして反映するには、コンパイルする必要があります。ただし、同じアセンブリのコードを変更する場合は、もちろんそれは少し難しいです。(そして、NCrunchは物事を単純化しないと思います。)
これが、これを解決できる可能性があることを私が望んでいることです。
- プロジェクトは、生成されたクラスなしでコンパイルされます。これは、クラスがIoCコンテナによって自動登録/解決されるインターフェイスを実装するためです。
ActivityContext
また、モックできないため、とにかくテストできません。 - そのため、常にそこにある必要はなく、修正する必要もありません。DLLを実際に配信する前に、「今すぐ生成」と言うことができれば十分です。
- 同じ理由で、T4テンプレートが実際にプロジェクトにあるかどうかも気にしません-生成されたファイルがプロジェクトに含まれる限り(ただし、テンプレート用に別のプロジェクトを必要とせず、ファイルをコピーするためのPostBuildイベントを作成する必要はありません
.cs
) 。 - 正確には、T4である必要はありません。他に実行可能な方法があれば、それも喜んで使用します。
これを達成する方法はありますか?(そしてそれは十分に明確でしたか?)