문제
방법이 주어졌습니다 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));
이렇게하면 새로 회전 한 대의원에게 즉시 전화하고 싶지 않은 경우를 포함하여 다른 상황에서 카레 코드를 재사용 할 수 있습니다. (예를 들어 나중에 더 카레를 만들고 싶을 수도 있습니다.)
제휴하지 않습니다 StackOverflow