2010-03-04 47 views
5

Tôi có một phần Expression<Func<T,DateTime>> Tôi muốn lấy phần DateTime của biểu thức và kéo tháng ra khỏi biểu thức đó. Vì vậy, tôi sẽ biến nó thành một Expression<Func<T,int>> Tôi không thực sự chắc chắn làm thế nào để làm điều này. Tôi nhìn vào số ExpressionTree Visitor nhưng tôi không thể làm cho nó hoạt động như tôi cần. Dưới đây là một ví dụ về DateTime BiểuTạo Biểu thức Mới từ Biểu thức Hiện tại

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

Dưới đây là một ví dụ về những gì tôi muốn tạo MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Dường như tôi cần phải tạo ra một MemberExpression mới được tạo thành từ tháng thuộc tính từ biểu thức DateTime nhưng tôi không chắc chắn.

+0

Tôi có thể lấy Trình xem cây biểu thức bạn đang sử dụng ở đâu? Liệu nó làm việc cho Visual Studio 2010? – MartinF

+0

Nó đi kèm với các mẫu LINQ. Có một ví dụ điển hình về việc sử dụng nó tại đây http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx Tôi thiên đường đã không thử nó trong Studio 2010 nhưng tôi biết nó hoạt động trong năm 2008. – Adam

Trả lời

8

Vâng, đó là chính xác những gì bạn muốn - và sử dụng Expression.Property là cách dễ nhất để làm điều đó:

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

Tôi tin rằng sẽ không sao. Nó hoạt động trong thử nghiệm đơn giản này:

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

Làm việc hoàn hảo. Cảm ơn bạn Jon. – Adam

Các vấn đề liên quan