gpt4 book ai didi

c# - 从 ExpressionTrees 获取值

转载 作者:太空狗 更新时间:2023-10-29 21:03:17 26 4
gpt4 key购买 nike

让有:

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

现在我通过使用获得值(value):

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)?

最佳答案

您可以将表达式包装在 lambda 中,然后对其进行编译和计算。无论它是哪种表达方式,它都会给您带来值(value)。

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

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


更新:如果你在编译时不知道右侧的类型,你可以使用对象,但是这会破坏像 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();

关于c# - 从 ExpressionTrees 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3457558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com