使用Lambda表达式作为参数?

时间:2009-09-24 18:13:24

标签: c# lambda

我想在我的存储库中使用lambda表达式 作为通用参数。如果我使用像这样的公司:

MyEntity entity:null

void Run(Expression<Func<MyEntity ,bool>> expression)

我可以这样称呼它:

Run(x => x.FirstName = "Whatever")

我想要的是能够做这样的事情:

Run(x => x.FirstName = "Whatever" and x.LastName = "whatelse")

Run(x => x.FirstName = "Whatever" && x.LastName = "whatelse")

并读取内部的x.FirstName和x.LastName的内容 程序运行。有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:4)

您将Run方法声明为:

void Run(Expression<Func<MyEntity ,bool>> expression)

如果您只是将其声明为:

,这将有效
void Run(Func<MyEntity ,bool> expression)

您是否有理由直接使用表达式,而不仅仅是代理(Func<MyEntity,bool>)?

答案 1 :(得分:0)

我认为你需要使用

void Run(Action<MyEntity> action)

然后

Run(x => {x.FirstName = "Whatever"; x.LastName = "whatelse"})

因为我没有看到你使用返回值。

不确定Expression&lt; Action&lt; MyEntity&gt;&gt;会工作(如果你需要检查),但你可以尝试。

答案 2 :(得分:0)

全部,OP传递Expression<Func<MyEntity, bool>>参数而不是Func<MyEntity, bool>参数的原因是他/她想要在Run方法中检查表达式本身。

Expression对象具有多个属性,使您可以在运行时检查表达式的特性。其中一个Body可用于识别表达式中使用的代码,而Parameters集合可用于检查在编译时可传递给表达式的参数的类型和顺序。

Console.WriteLine(expression.Parameters[0].Type); //writes MyEntity
Console.WriteLine(expression.Body); 
   //writes ((x.FirstName == "Bob" && x.LastName == "Smith"))

在您的示例中,您正在定义一个表达式,但实际上并未调用它。因此,您实际上没有传入参数(MyEntity对象),因此没有任何参数可供检查。

答案 3 :(得分:-1)

您是否尝试过以下操作:

Run(x => (x.FirstName == "Whatever" && x.LastName == "whatelse"))