追加表达式以创建不同类型的表达式

本文关键字:表达式 同类型 创建 追加 | 更新日期: 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);

即使我忘了什么,你现在也能想出来。

相关文章: