2009-09-24 89 views
1

我想在我的Repository 中使用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") 

并阅读内容o f x.FirstName和x.LastName在 里面的程序运行。有没有办法做到这一点?

+0

这可能有助于用您正在编写的语言标记此问题。 –

+0

我认为这是C#? – Matt

+0

你使用赋值运算符而不是平等测试吗?否则,最后的版本看起来很好。 – brianary

回答

4

你有你的Run方法声明为:

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

这只是工作,如果你只是它声明为:

void Run(Func<MyEntity ,bool> expression) 

有没有你正在做一个表达的一个原因,而不是只是一个代表(Func<MyEntity,bool>)直接?

+1

里德,我想象的是海报使用表达式来检查Run方法中的表达式(即,不只是执行它)。 –

+0

有区别吗? – user172105

-1

你有没有试过如下:

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

是的,它的工作原理,但我想知道程序运行中x.FirstName的价值,我该怎么做? – user172105

0

我认为你需要使用

void Run(Action<MyEntity> action) 

然后

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

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

不知道是否表达式<动作<MyEntity> >将工作(如果你需要检查它),但你可以尝试。

+0

是的,但我怎么读然后行动指定的值? – user172105

+0

为什么你不使用这个:{MyEntity tmp;动作(TMP); if(tmp.FirstName)...} - 如果你不想影响你的“工作”实体。 – queen3

+0

下面是如何解析Expression [Action]的示例代码的链接:http://stackoverflow.com/questions/717091/reflection-get-the-list-of-method-calls-inside-a-lambda-expression/717332#717332 – queen3

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对象),因此没有任何参数需要检查。