【问题标题】:Expression Tree ToString() method generates strange string WHY?表达式树 ToString() 方法生成奇怪的字符串 WHY?
【发布时间】:2014-05-04 18:29:25
【问题描述】:

我需要一个表达式树的字符串转换所以

我创建了一个表达式树并像这样使用 ToString 方法

var exp = ((Expression<Func<UserDetailInfo, bool>>) (x => x.OperationID == operationId)).ToString();

但结果很奇怪

x => (x.OperationID == value(TCS.Proxy.PermissionProxy+<>c__DisplayClass5).operationId)

TCS.Proxy.PermissionProxy 是我在 WCF 代理项目中的课程!!! (我将表达式从客户端发送到代理)

但是当我自己创建这个表达式时,一切都很好

var entity = Expression.Parameter(typeof(UserDetailInfo));
var constant = Expression.Constant(operationId);
var e = Expression.Equal(Expression.Property(entity, "OperationID"), constant);
var exp = Expression.Lambda<Func<UserDetailInfo, bool>>(e, entity).ToString();

结果还可以

Param_0 => (Param_0.OperationID == operationId) // I Need this

我如何使用 ToString() 来生成类似上面的结果?

为什么两个结果不同?

* 我将表达式转换为字符串以将其从客户端传输到 WCF 服务,因此我需要正确的字符串才能在服务器端从字符串转换为表达式

【问题讨论】:

    标签: c# wcf serialization expression-trees tostring


    【解决方案1】:

    这是因为您的右侧成员不是常量,而是捕获的变量。 TCS.Proxy.PermissionProxy+&lt;&gt;c__DisplayClass5 部分意味着在 TCS.Proxy.PermissionProxy 类中,它必须创建 5 个新类来保存通过变量捕获传入的值,并且这个特定的 lambda 使用它创建的第 5 个。

    你的代码(你从不展示你的功能,所以我做了一些猜测)

    namespace TCS.Proxy
    {
        class PermissionProxy
        {
             public void SomeFunction()
             {
                 int operationId = 0;
                 var exp = ((Expression<Func<UserDetailInfo, bool>>) (x => x.OperationID == operationId)).ToString()
             }
        }
    }
    

    正在被重写为类似的东西(实际上有很大不同,但这个例子说明了重点)

    namespace TCS.Proxy
    {
        public class PermissionProxy
        {
    
             private class c__DisplayClass5
             {
                 public int operationId;
             }
    
             public void SomeFunction()
             {
                 int operationId = 0;
    
                 var <>c__DisplayClass5 = new c__DisplayClass5();
                 <>c__DisplayClass5.operationId = operationId;
    
                 var exp = ((Expression<Func<UserDetailInfo, bool>>) (x => x.OperationID == <>c__DisplayClass5.operationId)).ToString()
             }
        }
    }
    

    这与您手动创建的不同。如果您想“拆箱”这些自定义类,您需要编写一个ExpressionVisitor,它将通过表达式并将其重新写入您想要通过网络传输的形式。

    【讨论】:

    • 你能建议一种将奇怪字符串转换为正确字符串的方法吗?例如修改字符串以转换为正确的模式?
    • 是的,您需要编写一个 ExpressionVisitor 类来执行重写。我链接了一个关于如何在答案中写作的教程。这里有更多simple tutorial
    • @Chamberlain 你能建议我一种将字符串转换为表达式树的方法吗?反之亦然?我想将表达式从客户端发送到 wcf 代理,然后将表达式转换为字符串并发送到服务中的 WCF 服务(表达式不可序列化)将字符串转换为表达式以在 WCF 服务中使用 LINQ ?!?!我想使用 Serialize.Linq 库但不起作用! stackoverflow.com/questions/23435468/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多