如何访问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;
}
包含字段值的对象包含在parameterExpression
的Expression
属性中。因此,将代码的倒数第二行改为:
object fieldValue = parameterFieldInfo.GetValue(
((ConstantExpression)parameterExpression.Expression).Value);
我们传入的实例是parameterExpression
中可用的常量闭包类型。
下面是一个。net演示解决方案。