我试图以@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,则少声明一次)。
实现安德烈答案的另一种方法就像不完全通用
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,这是不值得的。