문제

방법이 주어졌습니다 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);
}
도움이 되었습니까?

해결책

편집 : 주석에 언급 된 바와 같이, 이것은 카레이 아닌 부분 적용입니다. 나는 a 차이에 대한 이해에 대한 블로그 게시물, 어느 사람들이 흥미로울 수 있습니다.

글쎄, 그것은 특별히 다르지 않지만, 나는 카레이 부분을 "호출 량"부분과 분리 할 것입니다.

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