سؤال

نظرا لطريقة DoSomething يأخذ وظيفة (بدون معلمات) ويتعامل معها بطريقة ما.هل هناك طريقة أفضل لإنشاء "الأحمال الزائدة" للوظائف ذات المعلمات من المقتطف أدناه؟

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);
}
هل كانت مفيدة؟

المحلول

يحرر:كما هو مذكور في التعليقات، هذا تطبيق جزئي وليس كاري.كتبت أ بلوق وظيفة على فهمي للفرق, ، والتي قد يجدها الناس مثيرة للاهتمام.

حسنًا، الأمر ليس مختلفًا بشكل خاص - لكنني سأفصل جزء الكاري عن جزء "استدعاء 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

ثم:

DoSomething(Apply(foo, 1));

وبهذه الطريقة يمكنك إعادة استخدام رمز الكاري في مواقف أخرى - بما في ذلك الحالات التي لا تريد فيها الاتصال بالمندوب العائد حديثًا على الفور.(قد ترغب في تناول المزيد من الكاري لاحقًا، على سبيل المثال).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top