問題タブ [methodinfo]
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# - 式ツリーのメソッドの式を取得
式ツリーで次のクエリを作成したい:
式の作成方法:
私はすべてを試しましたが、Expression.Call メソッドの Field の MethodInfo を取得することさえできませんでした。フィールドは、DataRowExtentions の拡張メソッドです。
これには Expression.Call() を使用する必要がありますか? MethodInfo を取得するにはどうすればよいですか? それを行う簡単な方法はありますか?
私は試した :
ParameterExpression dataRow = Expression.Parameter(typeof(DataRowExtensions), "dataRow"); Expression left = Expression.Call(dataRow, typeof(DataRowExtensions).GetMethod("Field"));
しかし、うまくいきません。
IQueryable tempResults 内のデータに対して動的フィルターを作成したいと考えています。
ユーザーは、tempResults のデータに「Where」式を追加する GUI のチェックボックスをオンにします。ユーザーが「Column」を選択すると、ColumnName = "Column" の DataRows を提示したいと考えています。
そのため、where 式を作成する必要があります。しかし、私は MethodInfo のことにとてもこだわっています。私もこれを試しました:
しかし、それも機能しません。
それを行う他の方法はありますか?
c# - C# で属性を保持する型/メソッド/... への高速アクセス
ここでは、AAtribute という名前のカスタム属性を作成しました。たとえば、1 つ以上のメソッドがこの属性を使用する B というクラスを作成しました。アセンブリ全体を調べたり、属性に対して定義されたすべてのメソッドを調べたりせずに、属性 (この場合は BMethod1) をその属性 (の 1 つ) として保持するメソッドの MethodInfo を取得することは可能ですか? そして、それらは他の AttributeTargets (パラメーター/タイプ/プロパティ/...) の類似の方法ですか? そのタイプの属性を使用するすべてのメソッドの配列は必要ありませんが、この属性オブジェクトを部分的に使用するメソッドだけが必要です。メソッドに追加の制約を設定するために使用したい (戻り値の型、パラメーター、名前、その他の属性の使用法など)。
.net - メソッド(.NET)で使用されるフィールドを取得するにはどうすればよいですか?
.NETでは、リフレクションを使用して、メソッドで使用されるクラス変数を取得するにはどうすればよいですか?
元:
注:GetClassVariablesInMethod(M1 MethodInfo)は、B変数とC変数を返します。変数とは、その特定の変数の値および/またはタイプとコンストラクターパラメーターを意味します。
c# - インターフェイスタイプから取得したMethodInfoオブジェクトを、C#の実装タイプの対応するMethodInfoオブジェクトに変換しますか?
私が持っている質問はこれです:インターフェイスタイプから取得されたメソッドのMethodInfoオブジェクトがあり、このインターフェイスを実装するクラスのTypeオブジェクトもあるが、明示的な実装で前述のメソッドを実装している場合、そのクラスの実装メソッドに対応するMethodInfoオブジェクトを正しく取得するにはどうすればよいですか?
これを行う必要がある理由は、実装メソッドにいくつかの属性を適用でき、リフレクションを通じてこれらを見つける必要があるためですが、これらの属性を見つける必要があるクラスには、実装クラスとタイプのオブジェクト参照しかありません。インターフェイスのオブジェクト(+対応するMethodInfoオブジェクト)。
それで、私が次のプログラムを持っていると仮定しましょう:
これを実行すると、次のようになります。
コードの上部には、???を含む.GetMethod呼び出しがあります。コメント。この部分は私が助けを必要としているものです。ここで指定する必要があるもの(そして私は多くのテストを行ったため、別の方法になります)、またはこのコードを置き換える必要があるもののいずれかです。
インターフェイスからメソッドの明示的な実装を使用したため、メソッドの実際の名前は「テスト」だけではありません。クラスタイプのGetMethods()配列の内容全体を次のコードでダンプすると、次のようになります。
それから私はこれを手に入れます:
明らかに、名前にはインターフェイスのフルネームとその前の名前空間があります。ただし、オーバーロードが原因で、クラス内でそのような実装メソッドをすべて見つけて(つまり、パラメーターによって異なる複数のTestメソッドがあると仮定して)、パラメーターを比較する必要があるように見えます。
もっと簡単な方法はありますか?基本的に、インターフェイスからメソッドのMethodInfoオブジェクトを取得したら、MethodInfoオブジェクトを取得することにより、このメソッドを実装するクラスの正確なメソッドを見つけたいと思います。
ここではループ状態になっていることに注意してください。クラス内のメソッドをループしてインターフェイスから正確なメソッドを見つける必要がある場合は、見つけたタイミングを特定するための適切な方法がある限り、問題ありません。合っている物。
上記のループを次のように変更しようとしました:
これは何も出力しなかったので、そのGetBaseDefinitionようなメソッドでは明らかにインターフェイスからMethodInfoオブジェクトを指していません。
ポインタはありますか?
.net - 非ジェネリック .NET 型でジェネリック メソッドの MethodInfo を取得する方法は?
非ジェネリック型のジェネリック メソッドの MethodInfo を取得するために、どの引数を Type.GetMethod に渡すかがわからないという小さな問題があります。具体的には、次の型定義があります。
Type.GetMethod でいくつか試してみましたが、F メソッドの MethodInfo を返すものはありませんでした。
Type.GetMethods または Type.FindMember を呼び出すことができることは承知していますが、Type.GetMethod に興味があります。
何か案は?
ありがとう。
編集
実際、私のコードはもう少し複雑です。ジェネリック メソッドはオーバーロードされているため、Type.GetMethod を関数名だけで使用することはできません。私はこれらの変種を試しました:
c# - 非同期ランタイムメソッドの呼び出し
実行時にいくつかのアセンブリをロードし、Reflections(MethodInfo.Invoke)を使用してそれらのアセンブリにメソッドを呼び出しています。
ここで、これらの呼び出しを非同期にします。だから私はDelegate.BeginInvoke()を使うことを考えています。しかし、実行時に関数名を指定してデリゲートインスタンスを作成する方法がわかりません。(私が見るすべての例では、コンパイル時にデリゲートインスタンスターゲットが解決されています。)呼び出されるメソッドを含むMethodInfoオブジェクトがあります。これを行う方法はありますか?
c# - MethodInfo.ReturnType が System.Void のタイプであるかどうかをテストするには?
リフレクションを使用して MethodInfo を取得し、返された型が typeof System.Void であるかどうかをテストしたいと考えています。
System.Int32 であるかどうかのテストは正常に機能します
しかし
コンパイルされませんか?現在、名前の文字列表現が「System.Void」であるかどうかをテストしていますが、これは非常に間違っているようです。
.net - 明示的に実装されたMethodInfoオブジェクトによって参照されているインターフェイスを特定するにはどうすればよいですか?
MethodInfo次のように、明示的に実装されたインターフェイスメソッドを表すオブジェクトがあります。
MethodInfoこのオブジェクトをクエリして、実装するインターフェイスタイプ(Typeオブジェクトを表す)を取得するにはどうすればよいSystem.Collections.IEnumerableですか?このInterfaceMapping構造は逆の操作を提供し、特定のインターフェイスを実装するタイプのオブジェクトを取得するMethodInfoため、機能しません。
この情報のメソッド名を明確に解析できるため、これは不自然な例であることに注意してください。できればこれは避けたいと思います。
c# - MethodInfo、CreateDelegate、およびジェネリック メソッド
この質問でのJon Skeetの回答のおかげで、次の作業ができました。
戻り値の型とオーバーロードが異なるメソッドに同じことを適用しようとすると (これらは私が思いつく唯一の違いです)、迷惑な "ArgumentException: ターゲット メソッドへのバインディング エラー" が発生します。への通話中CreateDelegate。以下は、エラーを取得する実際の例です。コンソール アプリにコピー/貼り付けするだけです。
上記のように、私が見ることができる唯一の違いは次のとおりです。
- 異なる戻り値の型 (
T動作しますが、IEnumerable<T>動作しません) [編集: これは正しくありません。最初のバージョンではBaseItem、 ではなくが使用されていTます。おっとっと] - オーバーロード (オーバーロード
GetItemはありませんが、GetListいくつかあります。GetList()パラメーターのないデリゲートのみが必要です
Update1: Sam は、いくつかの問題を特定するのを手伝ってくれました。デリゲートの戻り値の型がジェネリック (例: IEnumerable<BaseItem>) の場合、基本型と派生型を交換しようとすると窒息します。以下のようにメソッドを宣言するGetList方法はありますか? Tがから継承されていることを示すことができる必要がありますがBaseItem、それができれば問題なく動作します。
もう 1 つのオプションは、デリゲート宣言を「ジェネリック化」することです。私が見つけることができるすべての例は、戻り値の型ではなく、params のジェネリックを使用しています。これを行うにはどうすればよいですか (原因が定義されていないコンパイラ エラーがスローされ、制約Tを使用できません):where
c# - intでMethodInfoを取得します
*Int32の演算子のMethodInfoを取得することは可能ですか?
私はこのコードを試しましたが、成功しませんでした(nullを返します):
ありがとう!