动态表达式“;x=>;x.日期>;=SomeDate”;

本文关键字:gt SomeDate 日期 表达式 动态 | 更新日期: 2023-09-27 18:28:41

我想构建表达式:x => x.Date >= SomeDate

但在下面的代码中,我只能得到x => ( x.Date >= SomeDate ),它根本不起作用,因为我想是圆括号。

Expression<Func<T, DateTime>> expression = x => x.Date;
var date= new DateTime(2013, 8, 22);
ParameterExpression param = Expression.Parameter(typeof(T), "x");
Expression lambda = Expression.Lambda<Func<T, bool>>(
Expression.GreaterThanOrEqual(expression.Body,
Expression.Constant(date, typeof(DateTime))), param);
var valueExpression = lambda as Expression<Func<T, bool>>;

动态表达式“;x=>;x.日期>;=SomeDate”;

代码的问题在于,表达式中的参数是通过引用而不是名称进行比较的。在您的情况下,解决此问题的最简单方法是使用原始表达式中的参数,而不是创建自己的:

ParameterExpression param = expression.Parameters.Single();
var lambda = Expression.Lambda<Func<T, bool>>(
    Expression.GreaterThanOrEqual(expression.Body, Expression.Constant(date)),
    param);

这对我来说似乎很好,你会得到什么样的错误?编译时/运行时?

请记住,要使x.Date工作,编译器必须在编译时知道类型T,并且它实际上包含Date属性。

我像这样实现了:

internal interface ITClass
{
    DateTime Date { get; set; }
}
internal class TClass : ITClass
{
    public DateTime Date { get; set; }
}

而且。。。

private static void CompareDate<T>() where T : ITClass
{
    Expression<Func<T, DateTime>> expression = x => x.Date;
    var date = new DateTime(2013, 8, 22);
    var param = Expression.Parameter(typeof(T), "x");
    Expression lambda = Expression.Lambda<Func<T, bool>>(
    Expression.GreaterThanOrEqual(expression.Body,
    Expression.Constant(date, typeof(DateTime))), param);
    var valueExpression = lambda as Expression<Func<T, bool>>;            
}