c# - How to access closed-over local variable in MemberExpression? -
i writing look analyzing code needs access value of parameters in expression<action>
.
the below code works whenever parameter fellow member or property on source object, fails when fellow member close-over local variable. how can access anonymous type closing on local variable can access local variable?
here's error message:
test method fluentcache.test.closuretest.test threw exception: system.argumentexception: field 'localvariable' defined on type 'test.closuretest+<>c__displayclass2' not field on target object of type 'test.closuretest'
here's simplified code:
[testmethod] public void test() { func<int, int> myaction = => + 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 invocationexpression; var parameterexpression = invocationexpression.arguments[0] memberexpression; var parameterfieldinfo = parameterexpression.member fieldinfo; //error: code fail because local variable "wrapped" in closure anonymous type //how access anonymous type in order retrieve value? object fieldvalue = parameterfieldinfo.getvalue(source); homecoming fieldvalue; }
the object containing value of field contained in expression
property of parameterexpression
. alter sec lastly line of code to:
object fieldvalue = parameterfieldinfo.getvalue( ((constantexpression)parameterexpression.expression).value);
the instance we're passing in constant closure type available via parameterexpression
.
here's .net fiddle demonstrating solution.
c# .net linq reflection
No comments:
Post a Comment