次のlinq式を変換しようとすると頭痛がします。
Expression<Func<T, object>>
次のlinq式に..
Expression<Func<T, U>>
上記の例では、オブジェクトは常にタイプU
です。
パラメータタイプ間で変換/キャストするのがいかに簡単かは知っていますが、リターンタイプ間でキャストする方法がよくわかりません。
次のlinq式を変換しようとすると頭痛がします。
Expression<Func<T, object>>
次のlinq式に..
Expression<Func<T, U>>
上記の例では、オブジェクトは常にタイプU
です。
パラメータタイプ間で変換/キャストするのがいかに簡単かは知っていますが、リターンタイプ間でキャストする方法がよくわかりません。
次の方法で新しい式を作成する必要があります。
Expression.Convert
して、結果の本体を作成します。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);
私の場合は、インターフェイスの入力タイプをMongoDBジェネリックリポジトリの具象タイプに変換していました。
私はから変換していました
Expression<Func<TIModel, bool>> iFilter
に
Expression<Func<TModel, bool>> filter
私はアニの答えからインスピレーションを得て、次のように変換しました。
var filter = Expression.Lambda<Func<TModel, bool>>(iFilter.Body, iFilter.Parameters);