2012-01-23 77 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

相關問題