让有:
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)?
您可以将表达式包装在 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)