c# - Is there a way to create a delegate to get and set values for a FieldInfo? -


for properties there getgetmethod , getsetmethod can do:

getter = (func<s, t>)delegate.createdelegate(typeof(func<s, t>),                                               propertyinfo.getgetmethod()); 

and

setter = (action<s, t>)delegate.createdelegate(typeof(action<s, t>),                                                 propertyinfo.getsetmethod()); 

but how go fieldinfos?

i not looking delegates getvalue , setvalue (which means invoking reflection each time)

getter = s => (t)fieldinfo.getvalue(s); setter = (s, t) => (t)fieldinfo.setvalue(s, t); 

but if there createdelegate approach here? i mean since assignments return value, can treat assignments method? if there methodinfo handle it? in other words how pass right methodinfo of setting , getting value member field createdelegate method delegate can read , write fields directly?

getter = (func<s, t>)delegate.createdelegate(typeof(func<s, t>), fieldinfo.??); setter = (action<s, t>)delegate.createdelegate(typeof(action<s, t>), fieldinfo.??); 

i can build expression , compile it, looking simpler. in end don't mind going expression route if there no answer asked question, shown below:

var instexp = expression.parameter(typeof(s)); var fieldexp = expression.field(instexp, fieldinfo); getter = expression.lambda<func<s, t>>(fieldexp, instexp).compile(); if (!fieldinfo.isinitonly) {     var valueexp = expression.parameter(typeof(t));     setter = expression.lambda<action<s, t>>(expression.assign(fieldexp, valueexp), instexp, valueexp).compile(); } 

or after nonexistent (since have seen yet) ?

field access isn't performed via method (like getters , setters)--it's performed il instruction--so there's nothing can assign delegate. you'll have use expression route create "block" of code (effectively il) can assigned delegate.


Comments

Popular posts from this blog

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -

node.js - Bad Request - node js ajax post -