私は、すべてのメソッドが次のように隣接しているいくつかのレガシーコードを継承しました。
Method()
{
Log("Entering");
...
Log("Exiting");
}
ある種のこと。それは醜く、確かに約千回自分自身を繰り返します。Railsにあるようなグローバルな「around_filter」を追加する方法はありますか?
私は、すべてのメソッドが次のように隣接しているいくつかのレガシーコードを継承しました。
Method()
{
Log("Entering");
...
Log("Exiting");
}
ある種のこと。それは醜く、確かに約千回自分自身を繰り返します。Railsにあるようなグローバルな「around_filter」を追加する方法はありますか?
もう1つのオプションは、Loggerクラスを設定することです。何かのようなもの:
public static class Logger
{
public static void Invoke(Delegate del, params object[] args)
{
Console.WriteLine("Entering");
del.DynamicInvoke(args);
Console.WriteLine("Exiting");
}
public static T Invoke<T>(Delegate del, params object[] args)
{
Console.WriteLine("Entering");
T rv = (T)del.DynamicInvoke(args);
Console.WriteLine("Exiting");
return rv;
}
}
そして、あなたはそれをこのように使うことができます:
static void Main(string[] args)
{
Logger.Invoke(new Action<int>(CountTo), 10);
Console.WriteLine("5 * 2 = {0}", Logger.Invoke<int>(new Func<int, int>(TwiceAsBig), 5));
}
static void CountTo(int num)
{
for (int i = 1; i <= num; ++i)
Console.WriteLine(i);
}
static int TwiceAsBig(int num)
{
return num * 2;
}
これは、 PostSharpなどのアスペクト織りツールを介したアスペクト指向プログラミングで実行できます。PostSharpの場合、OnMethodBoundaryAspectはこのタイプの機能を提供します。