考虑以下代码块:
Expression<Func<string, bool>> pred;
{
string s = "test";
pred = x => x == s;
}
// how to retrieve the value of s from just pred?
此块之后作用域中的唯一变量是pred
.仅使用pred
,我们如何检索捕获的变量s
的值?我可以通过展开pred
的对象图来查看调试器中的值,但如何在代码中做到这一点呢?
考虑以下代码块:
Expression<Func<string, bool>> pred;
{
string s = "test";
pred = x => x == s;
}
// how to retrieve the value of s from just pred?
此块之后作用域中的唯一变量是pred
.仅使用pred
,我们如何检索捕获的变量s
的值?我可以通过展开pred
的对象图来查看调试器中的值,但如何在代码中做到这一点呢?
您必须进行大量的强制转换才能得到ConstantExpression
的基础值,因为编译器会将该值隐藏起来.
下面的代码通过BinaryExpression
获取正确的 node ,判断正确的 node 是否为ConstantExpression
,并使用正确 node 的FieldInfo
来获得值:
var rightNodeMemberExpression = ((pred.Body as BinaryExpression).Right)
as MemberExpression;
var fieldInfo = rightNodeMemberExpression.Member as FieldInfo;
if (rightNodeMemberExpression.Expression is ConstantExpression exp)
{
var val = exp.Value;
var retrievedValue = fieldInfo.GetValue(val);
Console.WriteLine(retrievedValue); // will output "test"
}