2010-03-04 18 views
5

Tengo un Expression<Func<T,DateTime>> Quiero tomar la parte DateTime de la expresión y retirar el mes de ella. Así que estaría convirtiéndolo en Expression<Func<T,int>>. No estoy seguro de cómo hacer esto. Miré el ExpressionTree Visitor pero no puedo hacerlo funcionar como lo necesito. Aquí está un ejemplo de la expresión DateTimeCrear una nueva expresión a partir de una expresión existente

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

Aquí está un ejemplo de lo que quiero crear MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

Parece que tengo que crear una nueva MemberExpression que se compone del Mes propiedad de la expresión DateTime pero no estoy seguro.

+0

¿Dónde puedo obtener el Expression Tree Viewer que está utilizando? ¿Funciona para Visual Studio 2010? – MartinF

+0

Viene con las muestras de Linq. Hay un buen ejemplo de cómo usarlo aquí http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx I have Lo probé en Studio 2010, pero sé que funciona en 2008. – Adam

Respuesta

8

Sí, eso es exactamente lo que quiere - y el uso de Expression.Property es la forma más sencilla de hacerlo:

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

Creo que debería estar bien. Funciona en esta simple prueba:

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

Funcionó a la perfección. Gracias Jon. – Adam

Cuestiones relacionadas