动态表达式“;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>>;
代码的问题在于,表达式中的参数是通过引用而不是名称进行比较的。在您的情况下,解决此问题的最简单方法是使用原始表达式中的参数,而不是创建自己的:
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>>;
}