// フィルターチェーンを作る // 内側から外に向かってつないでいく foreach (var filter in filters.Reverse()) { // next をラムダにキャプチャーする必要がある var next_ = next; next = (context) => filter.Invoke(context, next_); }
// 呼び出す next(null);
このコードの実行結果はおおよそこんな感じになります。
A Begin B Begin at System.Environment.get_StackTrace() at Program.<>c.<Main>b__4_0(Object context) in C:\Program.cs:line 9 at Program.BFilter.Invoke(Object context, Action`1 next) in C:\Program.cs:line 44 at Program.<>c__DisplayClass4_1.<Main>b__1(Object context) in C:\Program.cs:line 17 at Program.AFilter.Invoke(Object context, Action`1 next) in C:\Program.cs:line 35 at Program.<>c__DisplayClass4_1.<Main>b__1(Object context) in C:\Program.cs:line 17 at Program.Main() in C:\Program.cs:line 21 (略) B End A End
foreach (var filter in filters.Reverse()) { next = new InvokeHelper<object, Action<object>>(filter.Invoke, next).GetDelegate(); }
そして実行すると…。
A Begin B Begin at System.Environment.get_StackTrace() at Program.<>c.<Main>b__4_0(Object context) in C:\Program.cs:line 9 at Program.BFilter.Invoke(Object context, Action`1 next) in C:\Program.cs:line 44 at Program.AFilter.Invoke(Object context, Action`1 next) in C:\Program.cs:line 35 at Program.Main() in C:\Program.cs:line 21 (略) B End A End