Frage

ein Verfahren DoSomething gegeben, das ein (parameterlos) -Funktion nimmt und behandelt sie in gewisser Weise. Gibt es einen besseren Weg, um die „Überlast“ für Funktionen mit Parametern als das Snippet unten?

erstellen
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);
}
War es hilfreich?

Lösung

EDIT: Wie in den Kommentaren erwähnt, diese partielle Anwendung ist nicht anzubiedern. Ich schrieb eine Blog-Post auf meinem Verständnis von der Differenz , die Leute interessant finden.

Nun, es ist nicht besonders anders - aber ich würde das Striegeln Teil aus dem „Aufruf DoSomething“ Teil trennen:

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

Dann:

DoSomething(Apply(foo, 1));

Auf diese Weise können die currying Code in anderen Situationen wiederverwendet werden können - einschließlich der Fälle, in denen Sie nicht wollen, sofort die neu zurück Delegierten rufen. (Vielleicht möchten Sie es später mehr Curry, zum Beispiel.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top