Это на самом деле лучший подход (учитывая, что Йоханнес сказал, что вы могли бы также использовать функцию более высокого порядка), так как он наиболее дружественный к типу (делегаты будут автоматически сопоставляться с правильным числом и типами аргументов) и не требует назойливых вызовов DynamicInvoke
.
Однако последнее определение метода проблематично.Action
по своей природе не принимает никаких параметров, поэтому он не будет хорошо играть с аргументом params object[]
.Если вы хотите окончательную перегрузку, которая принимает переменное число аргументов, я бы все-таки пошел с DynamicInvoke
, просто для вызова этого метода:
public void Execute(Delegate action, params object[] parameters)
{
DoStuff();
action.DynamicInvoke(parameters);
DoMoreStuff();
}
Но чтобы расширить то, что говорил Йоханнес, ядумаю, что он в основном получал что-то вроде этого:
public Action<T1, T2, T3> CreateAction<T1, T2, T3>(Action action)
{
return (T1 x, T2 y, T3 z) => action();
}
public Action<T1, T2, T3> CreateAction<T1, T2, T3>(Action<T1> action, T1 arg)
{
return (T1 x, T2 y, T3 z) => action(arg);
}
И так далее - другими словами, то, что вы уже сделали, но в общем контексте, так что код можно использовать повторно в других местах.