2017-05-05 59 views
0

我想打电话给这样的方法:我可以将lambda表达式数组传递给带有params参数的方法吗?

签名:void Method(object a, object b, params LambdaExpression[] expressions);

电话:Method(a, b, x => x.A, x => x.B)

这可能吗?

我们假设'x'的类型是一个常量类型。例如,如果x => xA且y => yB是Funcs,那么它们将是Func<TType,*>,这样params数组总是具有相同类型的TType,但返回值的类型*可能因参数的元素不同而不同阵列。这就是为什么我不得不选择像LambdaExpression那样更通用的类型,但我不知道这是否可行。我可以在运行时在方法中解压缩表达式,但是我只是在尝试将表达式传递给方法时遇到困难,因为它们的两个泛型类型参数之一有所不同。

这将是罚款,即使我不得不把它更像是:Method(a, b, (Type x) => x.A, (Type x) => x.B)

回答

2

可以,但编译器协助该会变成你的代码,以表达(VS编译它),只有仿制药工作。所以,你必须

Expression<Func<TType, AType>> expr1 = x => x.A; 
Expression<Func<TType, BType>> expr2 = x => x.B; 

Method(a, b, expr1, expr2); 

或铸造直列

Method(a, b, (Expression<Func<TType, AType>>) (x => x.A), expr2) 

,或者使用更通用的类型参数

void Method(object a, object b, params Expression<Func<object, object>>[] expressions) 
+0

所以基本上,答案是否定的。我必须在编译时指定类型。 – Triynko

+1

是的,但是您只使用可读性/更多的输入 - 在编译时您已经知道表达式的类型。 如果你想避免转换,你可以使用更通用的参数类型 - 参见更新。 – Bond

+0

最后一个解决方案是这样的,因为它允许你像这样调用诸如'void Method (params Expression >表达式)的方法:'方法(x => x.Wheel,x = > w.Door)'而不需要任何明确的转换。编译器能够从'x => x.Wheel'创建一个表达式,因为类型是'Expression >'。此外,表达式实际上可以在运行时使用反射和对“Expression.Lambda”的调用转换为更强大的类型,例如'Expression >',但这超出了此问题的范围。谢谢。 – Triynko

相关问题