Erstellen Sie einen neuen Ausdruck aus einem vorhandenen Ausdruck

.net c# expression expression-trees lambda

Frage

Ich habe einen Expression<Func<T,DateTime>> Ich möchte den DateTime-Teil des Ausdrucks nehmen und den Monat davon abziehen. Also würde ich es zu einem Expression<Func<T,int>> Ich bin mir nicht sicher, wie ich das machen soll. Ich habe den ExpressionTree-Besucher angeschaut, aber ich kann nicht so arbeiten, wie ich es brauche. Hier ist ein Beispiel für den DateTime-Ausdruck

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

Hier ist ein Beispiel, was ich MonthExpression erstellen möchte http://img203.imageshack.us/img203/8013/datetimontexpression.png

Es sieht so aus, als müsste ich eine neue MemberExpression erstellen, die aus der Date-Expression besteht, aber ich bin mir nicht sicher.

Akzeptierte Antwort

Ja, genau das möchten Sie - und mit Expression.Property das am einfachsten tun:

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

Ich glaube, das sollte in Ordnung sein. Es funktioniert in diesem einfachen 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;
    }                                        
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum