Это не отвечает на ваш вопрос напрямую, но вот как я решаю подобную проблему:
public static partial class Lambda
{
public static Action Pin<T0>
(
this Action<T0> action,
T0 arg0
)
{
return () => action(arg0);
}
public static Func<TResult> Pin<T0, TResult>
(
this Func<T0, TResult> func,
T0 arg0
)
{
return () => func(arg0);
}
public static Action Pin<T0, T1>
(
this Action<T0, T1> action,
T0 arg0,
T1 arg1
)
{
return () => action(arg0, arg1);
}
public static Func<TResult> Pin<T0, T1, TResult>
(
this Func<T0, T1, TResult> func,
T0 arg0,
T1 arg1
)
{
return () => func(arg0, arg1);
}
// More signatures omitted for brevity...
// I would love it if C# supported variadic template parameters :-)
}
Идея состоит в том, что если у вас есть Action
, который требует аргументов, вы можете сказать:
Action<int, string> foo;
Action a = foo.Pin(5, "bleh");
Имейте генератор кода .
Точно так же вы можете захотеть иметь способ карри к другому типу делегата (например, Action<string, int>
). Разница между моим и вашим методом состоит в том, что мой метод не связан с поздним связыванием, но вы все равно не используете позднее связывание, поэтому раннее связывание дает вам некоторую безопасность при компиляции.
Я не уверен, что вы можете сделать то, что, как я думаю, вы спрашиваете. Вы вызываете method.DynamicInvoke
с некоторыми object[]
, но как вы получили значения для этих параметров?
И чтобы ответить на вопрос, прежде чем кто-либо его спросит, я создал функции Lambda.Pin
, потому что устал от этой ошибки:
Action<int> foo;
foreach (int i in someList)
AddAction(() => foo(i));