2010-03-04 16 views
5

Mam Expression<Func<T,DateTime>> Chcę wziąć część wyrażenie DateTime i wyciągnąć miesiąc z niego. Więc zamieniłbym to w Expression<Func<T,int>> Nie jestem naprawdę pewien jak to zrobić. Spojrzałem na ExpressionTree Visitor, ale nie mogę go uruchomić tak, jak potrzebuję. Oto przykład z Expression DateTimeUtwórz nowe wyrażenie z istniejącej wypowiedzi

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

tutaj jest przykładem tego, co chcę stworzyć MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Wygląda na to, że trzeba stworzyć nową MemberExpression że składa się z miesiąca właściwość z wyrażenia DateTime, ale nie jestem pewien.

+0

Gdzie mogę uzyskać przeglądarkę drzewek ekspresji, z której korzystasz? Czy to działa dla Visual Studio 2010? – MartinF

+0

Pochodzi z próbek Linq. Istnieje dobry przykład wykorzystania go tutaj http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx I haven "Próbowałem go w Studio 2010, ale wiem, że działa w 2008 roku. – Adam

Odpowiedz

8

Tak, to jest dokładnie to, co chcesz - i za pomocą Expression.Property jest najprostszym sposobem, aby to zrobić:

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

Uważam, że powinno być w porządku. Działa w tym prostym teście:

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

Działa doskonale. Dziękuję Jon. – Adam

Powiązane problemy