0

I want to build the expression: x => x.Date >= SomeDate

But it the following code, all i can get is x => ( x.Date >= SomeDate ), which does not work at all, because of the parentheses I guess.

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>>;
4

2 回答 2

0

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

请记住,要使 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>>;            
}
于 2013-08-22T12:10:21.173 回答
0

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

ParameterExpression param = expression.Parameters.Single();
var lambda = Expression.Lambda<Func<T, bool>>(
    Expression.GreaterThanOrEqual(expression.Body, Expression.Constant(date)),
    param);
于 2013-08-22T13:22:16.697 回答