Domanda

Dato un metodo DoSomething che accetta una funzione (senza parametri) e la gestisce in qualche modo. Esiste un modo migliore per creare i "sovraccarichi" per funzioni con parametri diversi dallo snippet di seguito?

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);
}
È stato utile?

Soluzione

EDIT: come notato nei commenti, si tratta di un'applicazione parziale piuttosto che di curry. Ho scritto un post sul blog sulla mia comprensione della differenza , che la gente potrebbe trovare interessante.

Beh, non è particolarmente diverso, ma separerei la parte di curry dalla "chiamata DoSomething" parte:

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

Quindi:

DoSomething(Apply(foo, 1));

In questo modo è possibile riutilizzare il codice di curry in altre situazioni, inclusi i casi in cui non si desidera chiamare immediatamente il delegato appena restituito. (Potresti voler curry più tardi, per esempio.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top