将Linq表达式转换为字符串,其中包含给定属性值。

3

我希望将我的Linq表达式(Expression\\>)编译成字符串。

这个很好用:

Expression<Func<MyTestClass, bool>> q5 = x => x.Prop1 == "abc" || x.Prop2 == 123;

通过调用q5.Body.ToString(),我得到了预期的输出:

((x.Prop1 == "abc") OrElse (x.Prop2 == 123))

然而,当我将任何BinaryExpression的右侧替换为更复杂的值时,问题就开始了。例如:

    var item = new MyTestClass {Prop2 = 123};
        var prop2 = 23;
        string prop = "abc";

        Expression<Func<MyTestClass, bool>> q5 = x => x.Prop1 == prop || x.Prop2 == item.Prop2;

输出结果如下:

((x.Prop1 == value(Tests.LambdaTests+<>c__DisplayClass0_0).prop) OrElse (x.Prop2 == value(Tests.LambdaTests+<>c__DisplayClass0_0).item.Prop2))

我大致了解这个表达式为什么会编译成这样,可能需要查找MemberExpression类型的所有表达式部分并评估成员值,但是是否有更简单的方法来获得类似第一个示例的东西呢? 我所需要做的就是将“value(Tests.LambdaTests+<>c__DisplayClass0_0).item.Prop2)”替换为它的值。
谢谢。
1个回答

0
不,item是引用类型,并且必须在运行时解析。如果您稍后设置item.Prop2 = 456,那怎么办?编译器不知道何时评估q5,所以如果您要运行的话。
Expression<Func<MyTestClass, bool>> q5 = x => x.Prop1 == prop || x.Prop2 == item.Prop2;
Console.WriteLine(q5.Body);
item.Prop2 = 456;
Console.WriteLine(q5.Body);

您将获得两个相同的

((x.Prop1 == value(Tests.LambdaTests+<>c__DisplayClass0).prop) OrElse (x.Prop2 == = value(Tests.LambdaTests+<>c__DisplayClass0).item.Prop2))

通过在Lambda中保留值类型,编译器知道它不会改变,并且每次评估时,它将始终根据"abc"123进行检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接