Создайте новое выражение из существующего выражения

Я имею Expression> Я хочу принять участие DateTime выражения и осуществить Месяц его. Таким образом, я превратил бы его в a Expression> Я не действительно уверен, как сделать это. Я посмотрел на Посетителя ExpressionTree, но я не могу заставить это работать как, мне нужно. Вот пример Выражения DateTime

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

Вот пример того, что я хочу создать MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Похоже, что я должен создать новый MemberExpression, который составлен из свойства Month от выражения DateTime, но я не уверен.

6
задан Adam 4 March 2010 в 07:14
поделиться

1 ответ

Да, это именно то, что вы хотите - и использование 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, int>>(func, existingFunc.Parameters);
        return lambda;
    }                                        
}
8
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: