如何将表达式<Func<TSource,string>> 转换为表达式<Func<object,string>>
How to convert Expression<Func<TSource,string>> to Expression<Func<object,string>>
我正在动态创建一个表达式,我将其传递给某个方法,但该方法以不同的方式接受该表达式。它抛出异常:
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>>
尽管这样的转换是危险的,因为目标方法不能保证只在 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>>
类型的新表达式,可以传递给您的方法。
我正在动态创建一个表达式,我将其传递给某个方法,但该方法以不同的方式接受该表达式。它抛出异常:
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>>
尽管这样的转换是危险的,因为目标方法不能保证只在 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>>
类型的新表达式,可以传递给您的方法。