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
Post a Comment