我试图根据@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;
}
}
其中类型参数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 来说也少了一个)。
另一种实现安德烈答案的方法就像不完全通用
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,这不值得。