Crear nueva expresión a partir de la expresión existente

.net c# expression expression-trees lambda

Pregunta

Tengo una Expression<Func<T,DateTime>> Quiero tomar la parte DateTime de la expresión y quitarle el mes. Así que lo convertiría en una Expression<Func<T,int>> No estoy muy seguro de cómo hacerlo. Miré al visitante de ExpressionTree pero no puedo hacerlo funcionar como lo necesito. Aquí hay un ejemplo de la expresión DateTime

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

Aquí hay un ejemplo de lo que quiero crear MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Parece que necesito crear una nueva expresión de miembro que se compone de la propiedad Mes de la expresión DateTime, pero no estoy seguro.

Respuesta aceptada

Sí, eso es exactamente lo que quieres, y usar Expression.Property es la forma más fácil de hacerlo:

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

Creo que eso debería estar bien. Funciona en esta sencilla prueba:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow