【发布时间】:2018-06-18 14:36:48
【问题描述】:
我正在尝试将 Lambda 表达式从一个域转换为另一个域。 这是我收到的参数:
Expression<Func<Entities.UserRight, bool>> expression
我应该返回一个类型的表达式
Expression<Func<UserRight,bool>>
UserRight 和 Entities.UserRight 是相同的模型,但属于不同的 nugget 包。
我正在尝试:
public Expression<Func<UserRight,bool>> ConvertExpression(Expression<Func<Entities.UserRight, bool>> expression)
{
var resultBody = Expression.Convert(expression.Body, typeof(UserRight));
var result = Expression.Lambda<Func<UserRight, bool>>(resultBody, expression.Parameters);
return result;
}
但我收到 InvalidOperationException 错误
【问题讨论】:
-
最终您需要将第一个映射到另一个,因为不会进行原生转换。
-
要做到这一点,你需要从上到下重写表达式树;
ExpressionVisitor是理想的选择,但你不能天真,因为它包含诸如PropertyInfo/FieldInfo/MethodInfo标记之类的东西,你需要将它们映射到 other我>类型;这是可能的,但是... -
如果您有
UserRight(ur) 和Entities.UserRight(eur) 类型的变量,您将如何将一个变量转换为另一个变量? -
@NetMage 也许使用 AutoMapper,为什么?
-
因为如果你不能简单地从
eur转换为ur变量,你就不能在表达式树中做到这一点——你需要添加适当的 lambda 框架来准确地处理转换就好像你有变量一样。考虑将Func<Entities.UserRight, bool>转换为Func<UserRight, bool>- 您需要使用转换 lambdaur => feur(ur.ConvertToEUR())包装feur。
标签: c# lambda expression expression-trees linq-expressions