如何将Expression <func <tsource,string >>转换为Expression <func <object,string >>

时间:2019-04-05 07:20:55

标签: c# expression func

我正在动态创建一个表达式,并将其传递给某种方法,但是该方法以不同的方式接受该表达式。它引发异常:

Object of type
'System.Linq.Expressions.Expression`1[System.Func`2[Common.Domain.ViewModels.Dealer.CustomerGridViewModel,System.String]]'
cannot be converted to type
'System.Linq.Expressions.Expression`1[System.Func`2[System.Object,System.String]]'

我已经尝试过Using Expression to 'Cast' Func<object, object> to Func<T, TRet>的答案,但这对我不起作用。

我的表情是

Expression<Func<CustomerViewModel, string>> 

但我希望结果为

Expression<Func<object, string>>

1 个答案:

答案 0 :(得分:0)

尽管这样的转换很危险,因为不能保证仅在CustomerViewModel上运行目标方法,下面的代码使适配器表达式接受Object类型的参数,尝试进行转换将其传递到CustomerViewModel并在内部调用原始表达式:

var objParam = Expression.Parameter(typeof(object));
var call = Expression.Invoke(inputExpression, Expression.Convert(objParam, typeof(Foo)));
var outputExpression = Expression.Lambda<Func<object, string>>(call, objParam);

其中inputExpression是类型Expression<Func<CustomerViewModel, string>>的原始表达式,而outputExpression是类型Expression<Func<object, string>>的新表达式,可以传递给您的方法。