【发布时间】:2014-06-30 16:03:11
【问题描述】:
基本上我在运行时编译表达式,然后我用DynamicInvoke 方法调用它们,它们都应该返回布尔值,但问题是当进行字符串比较时,它会失败。假设像 {x.SomeProp == "value"} 这样的表达式 SomeProp 的值是 "value" 但是当我在该表达式上执行 DynamicInvoke 时,将适当的对象传递给它并将返回值转换为 bool 我得到 false 作为答案。
这是我用来构建表达式的代码
public static Expression BuildExpression(string propName, Operator op, object value, ParameterExpression paramExp)
{
var expressionType = new ExpressionType();
var leftOperand = CreateExpression(paramExp, propName);
var rightOperand = leftOperand.Type.BaseType == typeof(Enum) ?
Expression.Constant(Enum.Parse(leftOperand.Type, value.ToString(), true)) : Expression.Constant(Convert.ChangeType(value, leftOperand.Type));
var fieldInfo = expressionType.GetType().GetFields(Enum.GetName(typeof(Operator), op));
var expressionTypeValue = (ExpressionType)fieldInfo.GetValue(op);
var binaryExpression = Expression.MakeBinary(expressionType, leftOperand, rightOperand);
returnExpression;
}
private static Expression CreateExpression(ParameterExpression type, string propName)
{
Expression body = type;
body = Expression.PropertyOrField(body, propName);
return body;
}
paramExp基本上就是这个
var param = Expression.Parameter(someObjectType, "x");
现在这段代码在构建表达式方面做得很好,那么我做
Expression.Lambda(exp, param).Compile();
在上面,然后
copiledExp.DynamicInvoke(someObj);
比较int、double、float、decimal 甚至enum 值时它工作正常,但最近我遇到了比较字符串的问题。它在任何表达式上都返回 false
这是正在构建的表达式的视图。我的意思是,这是ToString() 方法返回的
"(x.SomeStringProp == \"stringValue\")"
【问题讨论】:
-
你尝试过显式转换吗?例如:x.SomeProp == new String("value")
-
你能提供
Expression.Lambda(exp, param).ToString()的示例输出吗? -
也许这些链接可以提供帮助:stackoverflow.com/questions/283537/… 和 (ExpressionComparison.cs) source.db4o.com/db4o/trunk/db4o.net/Db4objects.Db4o.Linq/…
标签: c# .net lambda expression