我有一个表达式< Func< T,DateTime>>我想取表达式的DateTime部分并从中拉出Month.所以我会把它变成一个表达式< Func< T,int>>我真的不确定怎么做.我看了
ExpressionTree Visitor,但我不能像我需要的那样工作.以下是DateTime表达式的示例
DateTimeExpression http://img442.imageshack.us/img442/6545/datetimeexpression.png
这是我想要创建的一个例子
MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png
看起来我需要创建一个新的MemberExpression,它由DateTime表达式的Month属性组成,但我不确定.
解决方法
是的,这正是你想要的 – 使用
Expression.Property
是最简单的方法:
Expression func = Expression.Property(existingFunc.Body,"Month"); Expression<Func<T,int>> lambda = Expression.Lambda<Func<T,int>>(func,existingFunc.Parameters);
我相信应该没问题.它适用于这个简单的测试:
using System; using System.Linq.Expressions; class Person { public DateTime Birthday { get; set; } } class Test { static void Main() { Person jon = new Person { Birthday = new DateTime(1976,6,19) }; Expression<Func<Person,DateTime>> dateTimeExtract = p => p.Birthday; var monthExtract = ExtractMonth(dateTimeExtract); var compiled = monthExtract.Compile(); Console.WriteLine(compiled(jon)); } static Expression<Func<T,int>> ExtractMonth<T> (Expression<Func<T,DateTime>> existingFunc) { Expression func = Expression.Property(existingFunc.Body,"Month"); Expression<Func<T,int>> lambda = Expression.Lambda<Func<T,existingFunc.Parameters); return lambda; } }