この質問の一部はデリゲートに関するものであり、一部はジェネリックに関するものです。
簡略化されたコードを考えると:
internal sealed class TypeDispatchProcessor
{
private readonly Dictionary<Type, Delegate> _actionByType
= new Dictionary<Type, Delegate>();
public void RegisterProcedure<T>(Action<T> action)
{
_actionByType[typeof(T)] = action;
}
public void ProcessItem(object item)
{
Delegate action;
if (_actionByType.TryGetValue(item.GetType(), out action))
{
// Can this call to DynamicInvoke be avoided?
action.DynamicInvoke(item);
}
}
}
SOの他の場所で、デリゲートを直接(括弧付きで)呼び出す方が、呼び出すよりも桁違いに速いことを読みましたDynamicInvoke
。これは理にかなっています。
上記のコードサンプルでは、型チェックを実行して、どういうわけかパフォーマンスを向上させることができるかどうか疑問に思っています。
いくつかのコンテキスト:さまざまなハンドラーにファームアウトされるオブジェクトのストリームがあり、それらのハンドラーは実行時に登録/登録解除できます。上記のパターンは私の目的には完全に機能しますが、可能であればよりスッキリさせたいと思います。
1つのオプションは、に格納Action<object>
し、デリゲートを別のデリゲートでDictionary
ラップすることです。Action<T>
この2回目の間接呼び出しが影響するパフォーマンスの変化はまだ比較していません。