追加表达式以创建不同类型的表达式
本文关键字:表达式 同类型 创建 追加 | 更新日期: 2023-09-27 18:27:06
我有一个接收Expression<Func<MyObject, object>>
的方法,我想通过调用object
上的方法来扩展它。扩展表达式的结果将始终是bool
。从本质上讲,我想将Expression<Func<MyObject, object>>
"转换"为Expression<Func<MyObject, bool>>
。
以下是我想做的要点。我意识到这并不能编译为ReportExpr
的类型Expression<Func<MyObject, bool>>
,而不是MethodCallExpression
,但我认为这传达了意图:
private MyObjectData CreateMyObjectData(string description,
FieldTypes fieldType, Expression<Func<MyObject, object>> expression)
{
var data= new MyObjectData()
{
ReportDesc = description,
FieldType = fieldType,
};
var method = typeof(DateTime?).GetMethod("Between");
Expression<Func<MyObject, DateTime?>> from = x => x.FromValue as DateTime?;
Expression<Func<MyObject, DateTime?>> to = x => x.ToValue as DateTime?;
var methodCallExpression = Expression.Call(expression, method, from, to);
data.ReportExpr = methodCallExpression;
return data;
}
所以您想从(Customer c) => c.SomeDateTime
转到(Customer c) => Between(c.SomeDateTime, a, b)
。查看调试器中的示例表达式,了解它们的结构。
表达式不包含常量。它包含一个参数c
。我们可以重复使用参数:
var cParam = expression.Parameters[0];
接下来我们分离CCD_ 12;
var memberAccess = expression.Body;
接下来我们构建新的身体:
Expression.Call(
"Between",
memberAccess,
Expression.Constant(DateTime.Now),
Expression.Constant(DateTime.Now));
接下来是新的lambda:
var lambda = Expression.Lambda<Func<Customer, bool>>(cParam, body);
即使我忘了什么,你现在也能想出来。