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