2016-01-20 2 views
3

Я хочу построить следующее выражение:Преобразование LambdaExpression в машинописные Expression <Func <T, object>> с возвращением бокс значения

Expression<Func<T, object>> 

У меня в настоящее время следующий код:

public class Strategy<T> 
{ 
    private static Expression<Func<T, object>> GetIt(PropertyInfo propertyInfo) 
    { 
     ParameterExpression parameter = Expression.Parameter(typeof(T)); 
     MemberExpression property = Expression.Property(parameter, propertyInfo); 
     Type funcType = typeof(Func<,>).MakeGenericType(typeof(T), typeof(object)); 

     //next line fails: can't convert int to object 
     LambdaExpression lambda = Expression.Lambda(funcType, property, parameter); 

     Expression<Func<T, object>> retval = (Expression<Func<T, object>>)lambda; 
     return retval; 
    } 
} 

Мой объект PropertyInfo имеет возвращаемый тип "int". Как я могу использовать бокс в своем выражении?

+2

'Выражение > RetVal = Expression.Lambda > (Expression.Convert (свойство, TypeOf (объект)), параметр);' – PetSerAl

ответ

0
public class ExpressionGetter<T> 
    { 
     public static Expression<Func<T, Object>> Get(PropertyInfo pInfo) 
     { 
      ParameterExpression parameter = Expression.Parameter(typeof(T)); 
      MemberExpression property = Expression.Property(parameter, pInfo); 
      Type funcType = typeof(Func<,>).MakeGenericType(typeof(T), typeof(object)); 

      //next line fails: can't convert int to object 

      LambdaExpression lambda; 
      if (typeof (T).IsClass == false && typeof (T).IsInterface == false) 
       lambda = Expression.Lambda(funcType, Expression.Convert(property, typeof (Object)), parameter); 
      else 
       lambda = Expression.Lambda(funcType, property, parameter); 

      return (Expression<Func<T, object>>)lambda; 
     } 
    } 
Смежные вопросы