我需要表达式树的字符串转换,所以
我创建了一个表达式树并使用像这样的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
答案 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,它将遍历表达式并将其重新写入您希望通过网络传输的表单。