Мы используем вот такой подход:
interface Function0<T>
{
T execute();
}
interface Function1<T, R>
{
T execute(R arg1);
}
interface Function2<T, R1, R2>
{
T execute(R1 arg1, R2 arg2);
}
interface Function3<T, R1, R2, R3>
{
T execute(R1 arg1, R2 arg2, R3 arg3);
}
...