9

次のlinq式を変換しようとすると頭痛がします。

    Expression<Func<T, object>>

次のlinq式に..

    Expression<Func<T, U>>

上記の例では、オブジェクトは常にタイプUです。

パラメータタイプ間で変換/キャストするのがいかに簡単かは知っていますが、リターンタイプ間でキャストする方法がよくわかりません。

4

2 に答える 2

10

次の方法で新しい式を作成する必要があります。

  1. ソース式の本体を使用Expression.Convertして、結果の本体を作成します。
  2. このボディを使用し、ソース式のパラメーターを再利用して、で変換されたラムダ式を作成しますExpression.Lambda

これを試して:

Expression<Func<T, object>> source = ...

var resultBody = Expression.Convert(source.Body, typeof(U));    
var result = Expression.Lambda<Func<T, U>>(resultBody, source.Parameters);
于 2013-02-25T13:21:51.960 に答える
0

私の場合は、インターフェイスの入力タイプをMongoDBジェネリックリポジトリの具象タイプに変換していました。

私はから変換していました

Expression<Func<TIModel, bool>> iFilter

Expression<Func<TModel, bool>> filter

私はアニの答えからインスピレーションを得て、次のように変換しました。

var filter = Expression.Lambda<Func<TModel, bool>>(iFilter.Body, iFilter.Parameters);
于 2019-09-02T08:09:57.773 に答える