60 votes

Comment lancer l'expression <Func<T, DateTime> > à l'expression <Func<T, object> >

J'ai cherché mais je ne trouve pas comment lancer du type

 Expression<Func<T, DateTime>>
 

au type:

 Expression<Func<T, object>>
 

Je dois donc me tourner à nouveau vers la si vaste connaissance;)

75voto

Jon Skeet Points 692016

Vous ne pouvez pas simplement jouer entre eux, car ils ne sont pas du même genre. Cependant, vous pouvez effectivement ajouter une conversion dans l’arbre des expressions:

 using System;
using System.Linq.Expressions;

class Test
{
    // This is the method you want, I think
    static Expression<Func<TInput,object>> AddBox<TInput, TOutput>
        (Expression<Func<TInput, TOutput>> expression)
    {
        // Add the boxing operation, but get a weakly typed expression
        Expression converted = Expression.Convert
             (expression.Body, typeof(object));
        // Use Expression.Lambda to get back to strong typing
        return Expression.Lambda<Func<TInput,object>>
             (converted, expression.Parameters);
    }

    // Just a simple demo
    static void Main()
    {
        Expression<Func<string, DateTime>> x = text => DateTime.Now;
        var y = AddBox(x);        
        object dt = y.Compile()("hi");
        Console.WriteLine(dt);
    }        
}
 

11voto

Rob Points 4309

Basé sur le code de Jon (merci btw), vous pouvez aller encore plus loin pour une flexibilité totale:

 public static Expression<Func<TModel, TToProperty>> Cast<TModel, TFromProperty, TToProperty>(Expression<Func<TModel, TFromProperty>> expression)
{
    Expression converted = Expression.Convert(expression.Body, typeof(TToProperty));

    return Expression.Lambda<Func<TModel, TToProperty>>(converted, expression.Parameters);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X