問題タブ [expressionvisitor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1543 参照

c# - クロージャーのために実際の値が DisplayClass にラップされたときに ConstantExpression.Value を取得する

以下は、私の問題の簡単なデモ コードです。

TestParamメソッドはVisitConstant、2 つの異なるパスで呼び出されます。

1. TestParam -> Search->VisitConstant

この実行パスSearchでは、メソッドに渡される定数式 (1L) は実定数値です。ここでは、すべて問題ありません。 assert は期待どおりに成功します。VisitConstant最初のパスnode.Value.GetType()isInt64およびその.Valueisを介して呼び出された場合1L

2. TestParam -> GetStudent-> Search->VisitConstant

この実行パス定数式 (id: 1L) では、引数として取り、クロージャー内のメソッドにGetStudent渡します。Search

問題

問題は 2 番目の実行パスにあります。がVisitConstant2 番目のパスを介して呼び出されnode.Value.GetType()、このクラスに(メソッドの引数と同じ)MyProject.Tests.ExpressionTests+<>c__DisplayClass0という名前の public フィールドがあり、値が.idGetStudent1L

質問

id2 番目のパスで値を取得するにはどうすればよいですか? DisplayClassクロージャ、aとは何か、コンパイル時に作成される理由などについて知っています。フィールド値を取得することにのみ関心があります。私が考えることができることの1つは、反射によるものです。以下のようなものですが、きれいに見えません。

ボーナス問題

値を取得するためのコードで遊んでいるときに、以下のようにメソッドidを変更しましVisitConstantたが (これでは問題は解決しません)、「'object' には 'id' の定義が含まれていません」という例外が発生します。

ここに画像の説明を入力

ボーナス質問

ダイナミクスは実行時に解決さDisplayClassれ、コンパイル時に作成されるため、なぜそのフィールドにアクセスできないのdynamicですか? 以下のコードは機能しますが、コードも機能することを期待していました。

0 投票する
1 に答える
109 参照

c# - Queryable c# join に参加する場合

クエリ可能な結合への参加を見つける方法を探しています...

基本的に、クエリ可能なステートメントの結合操作でモデル クラス X が使用されているかどうかを確認したい。David Fowl のQueryInterceptorを使用して、式ビジターを IQueryable に配置できます。次に、タイプがクラス X のパラメータの Lambda 式 (結合は一般的に表現されているように見えます) をチェックします。ビジターは、ヒットのフラグを切り替えることができます。

他の方法?繰り返しますが、クラス X が結合に関与しているかどうかだけに関心があります。

0 投票する
1 に答える
912 参照

c# - C# mongodb ドライバー解析用の既存の式から親オブジェクトに式ツリーを作成する

私はこのようなクラスを持っています:

そして、次のような他のジェネリック クラスがあります。

たとえば、次のような式があります。

この式を次のように変換するにはどうすればよいですか:

編集 :

私の質問では開発が不十分だったと思います。次のような方法が必要です。

編集 :

C# mongodb ドライバーによって解析される新しいツリー式を作成する必要があります。式ツリーで他の Compile メソッドを呼び出すことができません。

ExpressionVisitorを使用する必要があると思いますが、方法がわかりません...

0 投票する
2 に答える
345 参照

c# - 式ツリーの最も内側の例外がスローされないのはなぜですか?

ExpressionVisitor(オプションで)NullReferenceException最初の値にスローする式を生成するカスタムを作成しようとしていnullます。式のDebugViewは私には問題ないように見えますが、期待どおりに機能しません(私によると)。最初に投げると思った

テスト変数はありますがnull、代わりにこれがスローされるためです

ステートメントを逆方向に実行する理由がわかりません。If最初に最も内側を実行するべきではありませんか?

デバッグビュー:

私の完全なテストコード:

0 投票する
2 に答える
755 参照

c# - ExpressionVisitor には VisitMethodCall が呼び出されていません

LINQ プロバイダーを作成するためのMSDNのサンプル シリーズに従っていますが、壁にぶつかりました。

ExpressionVisitor次のテストを作成すると、以下のソースコードのサブクラスがVisitMethodCall呼び出されることを期待しています。

代わりに、VisitConstantメソッドが呼び出されます。これは、がインスタンス化されると、そのプロパティに a がProvider割り当てられるためだと思います。私が何か間違ったことをしているのか、それとも MSDN のガイドに問題があり、メソッド呼び出しを含む式を取得できないのかはわかりません。ExpressionConstantExpressionWhere

IQueryable<T>これは、とのIQueryProvider実装用に私が持っているソース コードです。

編集

IQueryableからのを実際に保存するように単体テストを更新しましたが.Where、まだVisitMethodCall呼び出しが表示されません。