2012-01-23 53 views
14

我已经创建了一个用于排序的表达式,可以正常工作,直到我找到DateTime字段,我得到以下错误(在第二行):类型的System.DateTime“的'System.DateTime'类型的表达式不能用于返回类型'System.Object'

表达式不能用于返回类型 'System.Object的'

这里是我的代码:

ParameterExpression param = Expression.Parameter(typeof(MyEntity), "x"); 

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Property(param, sortKey), param); 

任何人都可以帮忙吗?

+2

的可能重复['System.Int32'类型的表达式不能用于返回类型'System.Object'](http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- for-return-type-system-object) – nawfal

回答

30

就在里面添加一个转换:

Expression<Func<MyEntity, object>> sortExpression = 
    Expression.Lambda<Func<AMyEntity, object>>(
     Expression.Convert(
      Expression.Property(param, sortKey), 
      typeof(object)), 
     param); 
10

你似乎在期待值类型的自动装箱以匹配返回类型的表达式。不幸的是,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)); 
+0

完美工作 - 非常感谢! – Wildcat

相关问题