【问题标题】:Getting Values from ExpressionTrees从 ExpressionTrees 中获取值
【发布时间】:2010-08-11 10:57:48
【问题描述】:

让有:

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 不是常量表达式,而是字段表达式,但问题是我如何从中获取值(John)?

【问题讨论】:

    标签: c# lambda expression-trees


    【解决方案1】:

    您可以将表达式包装在 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();
    

    【讨论】:

    • 很好,但现在我必须设法访问它的类型,因为它的 func 所以由于某种原因我不能将 int 转换为 object 所以如果我返回 int 并且我将 Object 放入 func它会给出编译时错误
    • 太棒了,非常感谢你成功了,正如你从我的其他问题中看到的那样,我已经尝试学习表达式树一段时间了,糟糕的是我找不到关于它的好资源跨度>
    • 不错的编辑 Quartermeister,我可以请您提供参考,以发展我在表达树(如书籍或网站)方面的知识吗?非常感谢
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-01-15
    • 2011-02-15
    • 2012-10-15
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多