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;)
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;)
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);
}
}
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 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.