2010-03-04 12 views
5

Ich habe eine Expression<Func<T,DateTime>> Ich möchte den DateTime-Teil des Ausdrucks nehmen und den Monat davon abziehen. Also würde ich es in eine Expression<Func<T,int>> verwandeln Ich bin mir nicht wirklich sicher, wie man das macht. Ich schaute auf die ExpressionTree Visitor, aber ich kann es nicht funktionieren, wie ich brauche. Hier ist ein Beispiel des DateTime- ExpressionNeuen Ausdruck von vorhandenem Ausdruck erstellen

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

Hier ist ein Beispiel dafür, was ich MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

erstellen mag Es sieht aus wie ich brauche einen neuen Member zu erstellen, die auf dem Monats gemacht Eigenschaft aus dem DateTime-Ausdruck, aber ich bin mir nicht sicher.

+0

Woher bekomme ich den Expression Tree Viewer, den Sie verwenden? Funktioniert es für Visual Studio 2010? – MartinF

+0

Es kommt mit den Linq-Proben. Es gibt ein gutes Beispiel für die Verwendung hier http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx Ich habe 't versuchte es in Studio 2010, aber ich weiß, dass es in 2008 funktioniert. – Adam

Antwort

8

Ja, das ist genau das, was Sie wollen - und Expression.Property ist der einfachste Weg, dies zu tun:

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

Ich glaube, dass in Ordnung sein sollte. 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; 
    }           
} 
+0

Arbeitete perfekt. Danke Jon. – Adam