2013-08-22 20 views
0

我要建立的表达式:x => x.Date >= SomeDate动态表达“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>>; 
+2

“并不在所有的工作”过于含糊来帮助你。你在看什么?为什么你将'lambda'声明为'Expression'而不是直接声明为'Expression >'? –

回答

0

与您的代码的问题是,在表达式参数作为参考比较,不上名字。你的情况来解决这个最简单的方法是使用参数从原来的表达,而不是创建自己:

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

最后,就是这样!谢谢Svick! –

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>>;    
} 
+0

如果您尝试使用'valueExpression'(例如编译它),那么您将看到它不起作用。 – svick

相关问题