创建动态表达式<Func<T, Y>>

11
我想创建一个动态的 Expression<Func<T,Y>>。以下代码适用于字符串,但不适用于日期时间。我的意思是,我会得到这个异常:

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

有人能分析一下错误吗?
        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);

我需要将object更改为其他类型吗?如果是,那应该更改为哪种类型呢?正如您所看到的,我正在尝试动态获取PropertyInfo并将其用作Func的第二个参数。


1
它具体是怎么不工作的?它是否抛出异常?异常信息是什么? - svick
1个回答

15
对于值类型,您需要显式执行装箱操作(即转换为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);

对我有用,谢谢。不过,“expr = Expression.Property(expr, propertyInfo);”需要调整为“expr = Expression.Property(arg, propertyInfo);”,因为此时expr始终为空。 - MiiisterJim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接