2010-03-04 42 views
5

我有一個Expression<Func<T,DateTime>>我想採取表達式的DateTime部分並將其關閉。所以我會把它變成Expression<Func<T,int>>我不太確定如何做到這一點。我看着ExpressionTree Visitor,但我無法像我需要的那樣工作。下面是日期表達式從現有的表達式創建新的表達式

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

這裏的一個例子是什麼,我想創建 MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

它看起來像我需要創建一個由本月新MemberExpression爲例來自DateTime表達式的屬性,但我不確定。

+0

我在哪裏可以得到您正在使用的表達式樹查看器?它適用於Visual Studio 2010嗎? – MartinF 2010-11-17 02:35:56

+0

它附帶Linq樣品。這裏有一個很好的例子http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx我避難所在Studio 2010中沒有嘗試過,但我知道它在2008年有效。 – Adam 2010-11-17 02:58:15

回答

8

是的,這正是你想要的 - 並使用Expression.Property是做到這一點的最簡單的方法:我認爲,應該沒關係

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

。它在這個簡單的測試中工作:

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

完美工作。謝謝喬恩。 – Adam 2010-03-04 07:33:37