c# - Convert Expression<Func> to Expression<Func> and vice versa -



c# - Convert Expression<Func<T, TProperty>> to Expression<Func<object, object>> and vice versa -

is there way convert property selector expression<func<t, tproperty>> expression<func<object, object>> , vice versa? know how convert expression<func<t, object>> using...

expression<func<t, tproperty>> oldexp; expression.lambda<func<t, object>>(expression.convert(oldexp.body, typeof(object)), oldexp.parameters);

... need cast both, argument , result of function, not e.g replace them expressionvisitor because need casted later.

you right need utilize expressionvisitor , expressionconvert.

here 2 methods asked (as back upwards methods):

public expression<func<object, object>> converttoobject<tparm, treturn>(expression<func<tparm, treturn>> input) { var parm = expression.parameter(typeof(object)); var castparm = expression.convert(parm, typeof(tparm)); var body = replaceexpression(input.body, input.parameters[0], castparm); body = expression.convert(body, typeof(object)); homecoming expression.lambda<func<object, object>>(body, parm); } public expression<func<tparm, treturn>> convertback<tparm, treturn>(expression<func<object, object>> input) { var parm = expression.parameter(typeof(tparm)); var castparm = expression.convert(parm, typeof(object)); var body = replaceexpression(input.body, input.parameters[0], castparm); body = expression.convert(body, typeof(treturn)); homecoming expression.lambda<func<tparm, treturn>>(body, parm); } look replaceexpression(expression body, look source, look dest) { var replacer = new expressionreplacer(source, dest); homecoming replacer.visit(body); } public class expressionreplacer : expressionvisitor { look _source; look _dest; public expressionreplacer(expression source, look dest) { _source = source; _dest = dest; } public override look visit(expression node) { if (node == _source) homecoming _dest; homecoming base.visit(node); } }

sample usage:

expression<func<customer, string>> look = c => c.name; var convertedexpression = converttoobject<customer, string>(expression); var backexpression = convertback<customer, string>(convertedexpression);

of course of study can replace original 2 methods 1 method more type parameters:

public expression<func<ttargetparm, ttargetreturn>> convertgeneric<tparm, treturn, ttargetparm, ttargetreturn>(expression<func<tparm, treturn>> input) { var parm = expression.parameter(typeof(ttargetparm)); var castparm = expression.convert(parm, typeof(tparm)); var body = replaceexpression(input.body, input.parameters[0], castparm); body = expression.convert(body, typeof(ttargetreturn)); homecoming expression.lambda<func<ttargetparm, ttargetreturn>>(body, parm); }

sample usage:

expression<func<customer, string>> look = c => c.name; var convertedexpression = convertgeneric<customer, string, object, object>(expression); var backexpression = convertgeneric<object, object, customer, string>(convertedexpression);

c# properties casting lambda expression

Comments

Popular posts from this blog

xslt - DocBook 5 to PDF transform failing with error: "fo:flow" is missing child elements. Required content model: marker* -

mediawiki - How do I insert tables inside infoboxes on Wikia pages? -

Local Service User Logged into Windows -