Crea nuova espressione dall'espressione esistente

.net c# expression expression-trees lambda

Domanda

Ho Expression<Func<T,DateTime>> Voglio prendere la parte DateTime dell'espressione e tirare fuori il mese da esso. Quindi lo trasformerei in Expression<Func<T,int>> Non sono proprio sicuro di come farlo. Ho guardato il visitatore di ExpressionTree ma non riesco a farlo funzionare come ho bisogno. Ecco un esempio di Espressione DateTime

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

Ecco un esempio di ciò che voglio creare MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Sembra che ho bisogno di creare un nuovo membroExpression che è costituito dalla proprietà Month dall'espressione DateTime, ma non sono sicuro.

Risposta accettata

Sì, è esattamente quello che vuoi - e usare Expression.Property è il modo più semplice per farlo:

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

Credo che dovrebbe andare bene. Funziona con questo semplice test:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché