从ExpressionTrees获取值

时间:2010-08-11 10:57:48

标签: c# lambda expression-trees

让它:

Expression<Func<Customer, bool>> expression = c => c.Name == "John";

现在我通过使用:

获得价值
string myvalue = ((ConstantExpression) bin.Right).Value;

现在让它:

string x = "John";
Expression<Func<Customer, bool>> expression = c => c.Name == x;

现在我明白了

string myvalue = ((ConstantExpression) bin.Right).Value;

会产生错误,因为这里的bin.right不是constantexpression它是一个字段表达式,但问题是如何从中得到值(John)?

1 个答案:

答案 0 :(得分:13)

您可以将表达式包装在lambda中,然后对其进行编译和评估。无论表达式是什么,这都会给你带来价值。

string myvalue = Expression.Lambda<Func<string>>(bin.Right).Compile().Invoke();

请注意,如果在表达式的右侧使用参数c,则此方法无效,因为它不会被定义。另请注意,当您调用Invoke时,这将为您提供右侧的当前值,如果对象中的字段发生更改,则后续调用可能会返回不同的值。


更新:如果你在编译时不知道右边的类型,你可以使用object,但这会破坏像int这样的值类型。在返回之前,您需要使用Expression.Convert强制将值类型装箱。这适用于值类型和引用类型:

object myvalue = Expression.Lambda<Func<object>>(
    Expression.Convert(bin.Right, typeof(object))).Compile().Invoke();

您还可以使用无类型的lambda和DynamicInvoke:

object myvalue = Expression.Lambda(bin.Right).Compile().DynamicInvoke();