@Andrey Naumov 의 답변 을 기반으로 이것을 구축하려고했습니다 . 이것은 약간의 개선 일 수 있습니다.
public sealed class Lambda<S>
{
public static Func<S, T> CreateFunc<T>(Func<S, T> func)
{
return func;
}
public static Expression<Func<S, T>> CreateExpression<T>(Expression<Func<S, T>> expression)
{
return expression;
}
public Func<S, T> Func<T>(Func<S, T> func)
{
return func;
}
public Expression<Func<S, T>> Expression<T>(Expression<Func<S, T>> expression)
{
return expression;
}
}
여기서 type 매개 변수 S
는 형식 매개 변수 (나머지 유형을 추론하는 데 필요한 최소 입력 매개 변수)입니다. 이제 다음과 같이 호출 할 수 있습니다.
var l = new Lambda<int>();
var d1 = l.Func(x => x.ToString());
var e1 = l.Expression(x => "Hello!");
var d2 = l.Func(x => x + x);
//or if you have only one lambda, consider a static overload
var e2 = Lambda<int>.CreateExpression(x => "Hello!");
당신은 추가 오버로드 할 수 있습니다 Action<S>
와 Expression<Action<S>>
유사하게 같은 클래스를. 들어 다른 대의원과 표현 유형에 내장, 당신은 같은 별도의 클래스를 작성해야합니다 Lambda
, Lambda<S, T>
, Lambda<S, T, U>
등
이것의 장점은 원래 접근 방식에 비해 다음과 같습니다.
유형 사양이 하나 적습니다 (정식 매개 변수 만 지정하면 됨).
예에서 볼 수 있듯이 말이 Func<int, T>
있을 때뿐만 아니라 모든 에 대해 자유롭게 사용할 수 있습니다.T
string
즉시 표현을 지원합니다. 이전 접근 방식에서는 다음과 같이 유형을 다시 지정해야합니다.
var e = Lambda<Expression<Func<int, string>>>.Cast(x => "Hello!");
//or in case 'Cast' is an instance member on non-generic 'Lambda' class:
var e = lambda.Cast<Expression<Func<int, string>>>(x => "Hello!");
표현을 위해.
다른 대리자 (및 식) 유형에 대해 클래스를 확장하는 것도 위와 비슷하게 번거 롭습니다.
var e = Lambda<Action<int>>.Cast(x => x.ToString());
//or for Expression<Action<T>> if 'Cast' is an instance member on non-generic 'Lambda' class:
var e = lambda.Cast<Expression<Action<int>>>(x => x.ToString());
내 접근 방식에서는 유형을 한 번만 선언해야합니다 ( Func
s의 경우 너무 적음 ).
Andrey의 대답을 구현하는 또 다른 방법은 완전히 일반화되지 않는 것과 같습니다.
public sealed class Lambda<T>
{
public static Func<Func<T, object>, Func<T, object>> Func = x => x;
public static Func<Expression<Func<T, object>>, Expression<Func<T, object>>> Expression = x => x;
}
따라서 상황은 다음과 같이 줄어 듭니다.
var l = Lambda<int>.Expression;
var e1 = l(x => x.ToString());
var e2 = l(x => "Hello!");
var e3 = l(x => x + x);
그것은 더 적은 타이핑이지만 특정 유형 안전성을 잃고 imo는 그만한 가치가 없습니다.