从现有表达式创建新表达式

Ada*_*dam 6 .net c# lambda expression expression-trees

我有一个Expression<Func<T,DateTime>>我想采用表达式的DateTime部分并从中拉出月份.所以我会把它变成一个Expression<Func<T,int>>我不确定如何做到这一点.我看了一下ExpressionTree访客,但我不能让它像我需要的那样工作.以下是DateTime表达式的示例

DateTimeExpression http://img442.imageshack.us/img442/6545/datetimeexpression.png

以下是我想要创建 MonthExpression的示例http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

看起来我需要创建一个新的MemberExpression,它由DateTime表达式的Month属性组成,但我不确定.

Jon*_*eet 8

是的,这正是你想要的 - 使用Expression.Property是最简单的方法:

Expression func = Expression.Property(existingFunc.Body, "Month");
Expression<Func<T, int>> lambda = 
    Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters);
Run Code Online (Sandbox Code Playgroud)

我相信应该没问题.它适用于这个简单的测试:

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, int>>(func, existingFunc.Parameters);
        return lambda;
    }                                        
}
Run Code Online (Sandbox Code Playgroud)