2010-03-04 2 views
5

나는 Expression<Func<T,DateTime>>을 가지고 있습니다. 표현식의 DateTime 부분을 가져 와서 월을 제거하고 싶습니다. 그래서 저는 이것을 으로 바꿀 것입니다. 어떻게해야할지 모르겠습니다. ExpressionTree Visitor을 보았지만 필요한만큼 작동시키지 못합니다. 다음은 날짜 시간 여기에서 식을기존 표현식에서 새 표현식 만들기

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

의 예 내가 이달의로 구성되어 새로운 MemberExpression을 작성해야처럼 보이는 MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

를 만들려면 무엇의 예입니다 속성을 DateTime 식에서 가져 왔지만 확실하지 않습니다.

+0

어디에서 Expression Tree Viewer를 사용할 수 있습니까? Visual Studio 2010에서도 작동합니까? – MartinF

+0

Linq 샘플과 함께 제공됩니다. 여기에 사용하는 좋은 예가 있습니다. http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx I haven Studio 2010에서 시도했지만 2008 년에 작동하는 것으로 알고 있습니다. – Adam

답변

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

관련 문제