2

手動で式ツリーを作成すると、ランタイムが戻り値の型を自動的に決定するようです。したがって、次のような式ツリーを作成すると:

// Order contains a navigation property for Customer
(Order o) => o.Customer;

ランタイムは、戻り値の型を Customer として決定します。基本的には次のとおりです。

Expression<Func<Order, Customer>> efd = (Order o) => o.Customer;

どうすればビルドできますか、またはビルドしたものを変更できます。したがって、戻り値はオブジェクトです。つまり、式は次のようになります。

Expression<Func<Order, object>> ef = (Order o) => o.Customer;

これは一般的なものであり、コンパイル時に戻り値の型が Customer になるかどうかはわかりません。(この場合) 順序からの任意のナビゲーション プロパティである可能性があります。

明確化

次のような式から始めるとしましょう。

Expression<Func<OrderDTO, object>> ef = (OrderDTO o) => o.Customer;

OrderDTOこれを再構築し、ツリーをたどってtoOrderのタイプを変更し、 from / to タイプのマップに基づいてタイプを変更するルーチンがあります。やっていることはそれだけですが、結果の式は

Expression<Func<Order, Customer>> ef = (Order o) => o.Customer;

したがって、ツリーを再構築するときは、何らかの方法で戻り値の型を指定する必要があります。指定しなかったため、システムが戻り値の型を自動的に決定しているように見えます。ありがとう、レイ

4

2 に答える 2

1

コードを実際に見ないとなんとも言えExpression.Lambda()ませんが、作成した式の型を指定できない のバージョンを使用しているようです。そうすれば、デリゲート タイプが自動的に決定されるのは正しいです。

Expression.Lambda()これを修正するには、型パラメーターを使用してデリゲート型を指定できるバージョンを使用する必要があります (例: Expression.Lambda<Func<Order, object>>(…))、またはおそらく、デリゲート型が型の通常のパラメーターとして指定されるバージョンType( Expression.Lambda(funcType, …))。

于 2013-01-14T19:51:02.273 に答える