代码之家  ›  专栏  ›  技术社区  ›  antonioh

如何将表达式<Func<T,DateTime>>强制转换为表达式<Func<T,object>>

  •  54
  • antonioh  · 技术社区  · 17 年前

    我一直在寻找,但我找不到如何从类型转换

    Expression<Func<T, DateTime>>
    

    对于类型:

    Expression<Func<T, object>>
    

    4 回复  |  直到 17 年前
        1
  •  80
  •   Jon Skeet    17 年前

    你不能只是在他们之间转换,因为他们不是同一种东西。但是,您可以在表达式树中有效地添加转换:

    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);
        }        
    }
    
        2
  •  25
  •   Rookian    11 年前

    抢劫 和

    x => Convert(x.PropertyName) ,但通常情况下 ASP.NETMVC 你想要这样的表达吗 x => x.PropertyName

    Expression.Convert 是 某些情况下的表达式。

    public static class LambdaExpressionExtensions
    {
        public static Expression<Func<TInput, object>> ToUntypedPropertyExpression<TInput, TOutput> (this Expression<Func<TInput, TOutput>> expression)
        {
            var memberName = ((MemberExpression)expression.Body).Member.Name;
    
            var param = Expression.Parameter(typeof(TInput));
            var field = Expression.Property(param, memberName);
            return Expression.Lambda<Func<TInput, object>>(field, param);
        }
    }
    

    用法:

    Expression<Func<T, DateTime>> expression = ...;
    Expression<Func<T, object>> expr = expression.ToUntypedPropertyExpression();
    
        3
  •  11
  •   Rob    15 年前

    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);
    }
    
        4
  •  1
  •   LazZiya    10 年前

    Expression<Func<string, object>> dateExp = text => DateTime.Now;
    object dt = dateExp.Compile()("hi");
    Console.WriteLine(dt);
    

    Fiddle sample here