2012-01-23 18 views
14

Tôi đã tạo biểu thức mà tôi đang sử dụng để sắp xếp hoạt động tốt, cho đến khi tôi đạt được trường DateTime, nơi tôi nhận được lỗi sau (trên dòng thứ hai):Không thể sử dụng cụm từ 'System.DateTime' cho loại trả về 'System.Object'

Biểu hiện của loại 'System.DateTime' không thể được sử dụng cho các kiểu trả về 'System.Object'

Dưới đây là mã của tôi:

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

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

Có ai giúp được gì không?

+2

thể trùng lặp của [Biểu thức loại 'System.Int32' không thể được sử dụng cho kiểu trả về 'System.Object'] (http://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used- for-return-type-system-object) – nawfal

Trả lời

30

Chỉ cần thêm một sự chuyển đổi trong đó:

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

Bạn dường như mong đợi auto-boxing của giá trị các loại để phù hợp với sự trở lại kiểu của biểu thức. Thật không may, Expression.Lambda không làm điều này.

Bạn có thể sử dụng Expression.Convert để thực hiện quyền anh.

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

Nếu vì một số lý do bạn không muốn hoạt động chuyển đổi để có mặt trong biểu thức nếu tài sản là đã là một tài liệu tham khảo kiểu, bạn có thể chi nhánh theo yêu cầu:

Expression body = Expression.Property(param, sortKey); 

if(body.Type.IsValueType) 
    body = Expression.Convert(body, typeof(object)); 
+0

Hoạt động hoàn hảo - cảm ơn rất nhiều! – Wildcat

Các vấn đề liên quan