我已经创建了一个表达式,我正在使用它进行排序工作正常,直到我点击DateTime
字段,我得到以下错误(在第二行):
'System.DateTime'类型的表达式不能用于返回类型 'System.Object的'
这是我的代码:
ParameterExpression param = Expression.Parameter(typeof(MyEntity), "x");
Expression<Func<MyEntity, object>> sortExpression =
Expression.Lambda<Func<AMyEntity, object>>(
Expression.Property(param, sortKey), param);
任何人都可以提供帮助吗?
答案 0 :(得分:33)
只需在其中添加转化:
Expression<Func<MyEntity, object>> sortExpression =
Expression.Lambda<Func<AMyEntity, object>>(
Expression.Convert(
Expression.Property(param, sortKey),
typeof(object)),
param);
答案 1 :(得分:11)
您似乎期望自动装箱值类型以匹配表达式的返回类型。不幸的是,Expression.Lambda
没有这样做。
您可以使用Expression.Convert
来执行拳击。
var body = Expression.Convert(Expression.Property(param, sortKey), typeof(object));
var sortExpression = Expression.Lambda<Func<AMyEntity, object>>(body, param);
如果出于某种原因,如果属性已经是引用类型,则不希望转换操作出现在表达式中,您可以根据需要进行分支:
Expression body = Expression.Property(param, sortKey);
if(body.Type.IsValueType)
body = Expression.Convert(body, typeof(object));