表达式树ToString()方法生成奇怪的字符串为什么?

时间:2014-05-04 18:29:26

标签: c# wcf serialization expression-trees tostring

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

我创建了一个表达式树并使用像这样的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()可以生成如上所示的结果?

为什么两个结果不同?

* 我将Expression转换为String以便将它从客户端传输到WCF服务所以我需要正确的字符串,以便在服务器端将字符串转换为Expression

1 个答案:

答案 0 :(得分:1)

这是因为你的右手边成员不是常数,它是一个被捕获的变量。 TCS.Proxy.PermissionProxy+<>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()
         }
    }
}

这与手动创建的不同。如果你想&#34; unbox&#34;这些自定义类,您需要编写一个ExpressionVisitor,它将遍历表达式并将其重新写入您希望通过网络传输的表单。