如何访问MemberExpression中的封闭局部变量

本文关键字:局部变量 MemberExpression 何访问 访问 | 更新日期: 2023-09-27 18:09:16

我正在编写一些表达式分析代码,需要访问Expression<Action>中的参数值。

当形参是源对象的成员或属性时,下面的代码就可以工作,但是当成员是封闭局部变量时就会失败。如何访问封闭局部变量的匿名类型,以便访问局部变量?

错误信息如下:

Test method FluentCache.Test.ClosureTest.Test threw exception: 
System.ArgumentException: Field 'localVariable' defined on type 'Test.ClosureTest+<>c__DisplayClass2' is not a field on the target object which is of type 'Test.ClosureTest'
下面是简化后的代码:
[TestMethod]
public void Test()
{
    Func<int, int> myAction = i => i + 1;
    int localVariable = 10;
    int analyzed = (int)GetFirstParameterValue(this, () => myAction(localVariable));
    Assert.AreEqual(localVariable, analyzed);
}
public object GetFirstParameterValue(object source, Expression<Action> expression)
{
    var invocationExpression = expression.Body as InvocationExpression;
    var parameterExpression = invocationExpression.Arguments[0] as MemberExpression;
    var parameterFieldInfo = parameterExpression.Member as FieldInfo;
    //ERROR: This code will fail because the local variable is "wrapped" in a closure anonymous type
    //How do I get access to the anonymous type in order to retrieve the value?
    object fieldValue = parameterFieldInfo.GetValue(source);
    return fieldValue;
}

如何访问MemberExpression中的封闭局部变量

包含字段值的对象包含在parameterExpressionExpression属性中。因此,将代码的倒数第二行改为:

object fieldValue = parameterFieldInfo.GetValue(
    ((ConstantExpression)parameterExpression.Expression).Value);

我们传入的实例是parameterExpression中可用的常量闭包类型。

下面是一个。net演示解决方案。