問題タブ [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.
c# - クロージャーのために実際の値が DisplayClass にラップされたときに ConstantExpression.Value を取得する
以下は、私の問題の簡単なデモ コードです。
TestParam
メソッドはVisitConstant
、2 つの異なるパスで呼び出されます。
1. TestParam
-> Search
->VisitConstant
この実行パスSearch
では、メソッドに渡される定数式 (1L) は実定数値です。ここでは、すべて問題ありません。 assert は期待どおりに成功します。VisitConstant
最初のパスnode.Value.GetType()
isInt64
およびその.Value
isを介して呼び出された場合1L
。
2. TestParam
-> GetStudent
-> Search
->VisitConstant
この実行パス定数式 (id: 1L) では、引数として取り、クロージャー内のメソッドにGetStudent
渡します。Search
問題
問題は 2 番目の実行パスにあります。がVisitConstant
2 番目のパスを介して呼び出されnode.Value.GetType()
、このクラスに(メソッドの引数と同じ)MyProject.Tests.ExpressionTests+<>c__DisplayClass0
という名前の public フィールドがあり、値が.id
GetStudent
1L
質問
id
2 番目のパスで値を取得するにはどうすればよいですか? DisplayClass
クロージャ、aとは何か、コンパイル時に作成される理由などについて知っています。フィールド値を取得することにのみ関心があります。私が考えることができることの1つは、反射によるものです。以下のようなものですが、きれいに見えません。
ボーナス問題
値を取得するためのコードで遊んでいるときに、以下のようにメソッドid
を変更しましVisitConstant
たが (これでは問題は解決しません)、「'object' には 'id' の定義が含まれていません」という例外が発生します。
ボーナス質問
ダイナミクスは実行時に解決さDisplayClass
れ、コンパイル時に作成されるため、なぜそのフィールドにアクセスできないのdynamic
ですか? 以下のコードは機能しますが、コードも機能することを期待していました。
c# - Queryable c# join に参加する場合
クエリ可能な結合への参加を見つける方法を探しています...
基本的に、クエリ可能なステートメントの結合操作でモデル クラス X が使用されているかどうかを確認したい。David Fowl のQueryInterceptorを使用して、式ビジターを IQueryable に配置できます。次に、タイプがクラス X のパラメータの Lambda 式 (結合は一般的に表現されているように見えます) をチェックします。ビジターは、ヒットのフラグを切り替えることができます。
他の方法?繰り返しますが、クラス X が結合に関与しているかどうかだけに関心があります。
c# - C# mongodb ドライバー解析用の既存の式から親オブジェクトに式ツリーを作成する
私はこのようなクラスを持っています:
そして、次のような他のジェネリック クラスがあります。
たとえば、次のような式があります。
この式を次のように変換するにはどうすればよいですか:
編集 :
私の質問では開発が不十分だったと思います。次のような方法が必要です。
編集 :
C# mongodb ドライバーによって解析される新しいツリー式を作成する必要があります。式ツリーで他の Compile メソッドを呼び出すことができません。
ExpressionVisitorを使用する必要があると思いますが、方法がわかりません...
c# - 式ツリーの最も内側の例外がスローされないのはなぜですか?
ExpressionVisitor
(オプションで)NullReferenceException
最初の値にスローする式を生成するカスタムを作成しようとしていnull
ます。式のDebugView
は私には問題ないように見えますが、期待どおりに機能しません(私によると)。最初に投げると思った
テスト変数はありますがnull
、代わりにこれがスローされるためです
ステートメントを逆方向に実行する理由がわかりません。If
最初に最も内側を実行するべきではありませんか?
デバッグビュー:
私の完全なテストコード:
c# - ExpressionVisitor には VisitMethodCall が呼び出されていません
LINQ プロバイダーを作成するためのMSDNのサンプル シリーズに従っていますが、壁にぶつかりました。
ExpressionVisitor
次のテストを作成すると、以下のソースコードのサブクラスがVisitMethodCall
呼び出されることを期待しています。
代わりに、VisitConstant
メソッドが呼び出されます。これは、がインスタンス化されると、そのプロパティに a がProvider
割り当てられるためだと思います。私が何か間違ったことをしているのか、それとも MSDN のガイドに問題があり、メソッド呼び出しを含む式を取得できないのかはわかりません。Expression
ConstantExpression
Where
IQueryable<T>
これは、とのIQueryProvider
実装用に私が持っているソース コードです。
編集
IQueryable
からのを実際に保存するように単体テストを更新しましたが.Where
、まだVisitMethodCall
呼び出しが表示されません。