这个问题部分是关于代表的,部分是关于泛型的。
给定简化的代码:
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
,这是有道理的。
对于上面的代码示例,我想知道是否可以执行类型检查并以某种方式提高性能。
一些上下文:我有一个对象流,这些对象流被分配给各种处理程序,并且这些处理程序可以在运行时注册/注销。上面的模式非常适合我的目的,但如果可能的话,我想让它更快捷。
一种选择是将代表存储Action<object>
在Dictionary
, 并用另一个代表包装Action<T>
代表。我还没有比较第二次间接调用会影响的性能变化。