11

I want to create a dynamic Expression<Func<T,Y>>. Here is the code which works for string but doesn't work for DateTime. By doesn't work I mean, I get this exception:

"Expression of type 'System.Nullable`1[System.DateTime]' cannot be used for return type 'System.Object'"

Can anybody analyze the mistake?

        Type type = typeof(DSVPNProjection);
        ParameterExpression arg = Expression.Parameter(type, "x");
        Expression expr = arg;

        PropertyInfo propertyInfo = type.GetProperty(sidx);
        expr = Expression.Property(expr, propertyInfo);

        var expression = 
        Expression.Lambda<Func<DSVPNProjection, object>>(expr, arg);

Do I need to change the object to some other type? If yes, then which? As you can see I am trying to dynamically fetch the PropertyInfo and use that as the 2nd parameter in Func.

TCM
  • 16,780
  • 43
  • 156
  • 254

1 Answers1

15

For value types, you need to perform the boxing explicitly (i.e. convert to Object):

    Type type = typeof(DSVPNProjection);
    ParameterExpression arg = Expression.Parameter(type, "x");
    Expression expr = null;

    PropertyInfo propertyInfo = type.GetProperty(sidx);
    expr = Expression.Property(arg, propertyInfo);
    if (propertyInfo.PropertyType.IsValueType)
        expr = Expression.Convert(expr, typeof(object));

    var expression = 
    Expression.Lambda<Func<DSVPNProjection, object>>(expr, arg);
Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
  • Worked for me thanks, although "expr = Expression.Property(expr, propertyInfo);" needs tweaking to "expr = Expression.Property(arg, propertyInfo);" as expr is always null at this point – MiiisterJim Feb 12 '13 at 12:03