我想在我的存储库中使用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的内容 程序运行。有没有办法实现这个目标?
答案 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"))