2012-01-23 47 views
14

ソートのために使用している式を作成しました。DateTimeフィールド(2行目)、エラー、次の型 'の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-戻り型システムオブジェクト) – 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

関連する問題