Thursday, 15 May 2014

c# - How to access closed-over local variable in MemberExpression? -



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