Этот вопрос частично связан с делегатами, а частично - с дженериками.
Учитывая упрощенный код:
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>
другим делегатом. Я еще не сравнил изменение производительности, которое повлияет на этот второй косвенный вызов.