Pergunta

Dada uma DoSomething método que leva uma função (sem parâmetros) e manipula-lo de alguma forma. Existe uma maneira melhor para criar os "sobrecargas" para funções com parâmetros do que o trecho abaixo?

public static TResult DoSomething<TResult>(Func<TResult> func)
{
    //call func() and do something else
}

public static TResult DoSomething<T0, TResult>(
    Func<T0, TResult> func,
    T0 arg0)
{
    return DoSomething(() => func(arg0));
}

public static TResult DoSomething<T0, T1, TResult>(
    Func<T0, T1, TResult> func,
    T0 arg0, T1 arg1)
{
    return DoSomething(arg => func(arg, arg1), arg0);
}

public static TResult DoSomething<T0, T1, T2, TResult>(
    Func<T0, T1, T2, TResult> func,
    T0 arg0, T1 arg1, T2 arg2)
{
    return DoSomething(arg => func(arg, arg1, arg2), arg0);
}
Foi útil?

Solução

EDIT: Como observado nos comentários, esta é a aplicação parcial em vez de currying. Eu escrevi um blog sobre a minha compreensão da diferença , que pessoas podem achar interessante.

Bem, não é particularmente diferente - mas eu separar a parte currying da parte "chamar DoSomething":

public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
    return () => func(arg);
}

public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

Depois:

DoSomething(Apply(foo, 1));

Dessa forma, você pode reutilizar o código currying em outras situações - incluindo os casos em que você não quer chamar o delegado recém-retornado imediatamente. (Você pode querer caril-lo mais tarde, por exemplo.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top