現在、既存のアプリケーションのロギングが非常に必要であり、期待するレベルのロギングをコードに直接追加する余裕がありません。回避策として、イベントが発生するたびに一定量のログが記録されることを嬉しく思います。
実行時にアプリケーション全体を解析して、すべてのイベントからハンドラーへのバインディングをイベントからラッパーからハンドラーにラップできるソリューションを検討しています。そして、理想的には、実行時にもそれらをアンラップします。擬似コードでは、これは次のようになります。
IDictionary<Event, Action<object, EventArgs>) originalBindings = ...;
public void SetWrapBindings()
{
var allBindingsToReplace = Assembly.GetAssembly().GETALLEVENTS()
.Where(eventInfo => eventInfo.GetOtherMethods().Any());
foreach(var binding in allBindingsToReplace)
{
binding.event -= binding.handler;
binding.event += HandlerWrapper;
originalBindings.Add(binding.event, binding.handler);
}
}
public static void HandlerWrapper(object o, EventArgs e)
{
// Do some logging
try
{
var handler = originalBindings.TryGetValue(/* something */);
handler.Invoke(o, e);
}
// Do more logging
}
この一連の擬似コードには、おそらく正しいAPIの使用法が見つからなかったためか、理論的には不可能な操作が原因で、記述できなかった多くのステップがあります(この場合、私は理由を知るために)。これらは:
- アプリケーションのすべてのイベントを反復処理します(これはおそらく簡単です)
- IDictionaryに適したキーを特定する
- 各ステップで、コンテキストから関連情報を取得します
もちろん、既存の各イベントに1つの追加ハンドラーをバインドする(ハンドラーを実際にラップせずにルーチンを実行する前/後)ことは役立ちますが、try-catch内で実際のハンドラーを実行することは非常に便利です。
部分的な答えはまだ大歓迎です