如何在不同返回类型的Linq表达式之间进行转换?

10

我正在努力将以下Linq表达式转换,但感到头痛。

    Expression<Func<T, object>>

以下是LINQ表达式:

    Expression<Func<T, U>>

在上述示例中,对象始终为类型U
我知道将参数类型进行转换/强制转换非常容易,但不确定如何在返回类型之间进行强制转换。

这个问题可能与以下内容相关:http://stackoverflow.com/questions/13171737/conversion-of-linq-expressions-from-business-to-domain-types - Spontifixus
似乎有关联,但实际上并不是。我需要转换返回类型而不是参数。将表达式的参数转换是相当直接的。 - Leo
你能提供一些关于代码的更多细节吗?这两个表达式是一个类中两个方法的返回类型吗? - Tobias
你正在使用哪个框架? - Teejay
https://dev59.com/SGPVa4cB1Zd3GeqP88h2#10643755 - Double Down
2个回答

10

您需要通过以下步骤创建一个新的表达式:

  1. 使用 Expression.Convert 覆盖源表达式的主体,从而创建结果的主体。
  2. 使用此主体并重用源表达式的参数,使用 Expression.Lambda 创建转换后的 lambda 表达式。

请尝试以下操作:

Expression<Func<T, object>> source = ...

var resultBody = Expression.Convert(source.Body, typeof(U));    
var result = Expression.Lambda<Func<T, U>>(resultBody, source.Parameters);

0

我的情况是将接口输入类型转换为适用于我的MongoDB通用存储库的具体类型。

我正在从中进行转换

Expression<Func<TIModel, bool>> iFilter

Expression<Func<TModel, bool>> filter

我受到Ani的回答的启发,进行了如下转换:

var filter = Expression.Lambda<Func<TModel, bool>>(iFilter.Body, iFilter.Parameters);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接