問題タブ [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.

0 投票する
3 に答える
6789 参照

c# - MethodInfo に必要なパラメーターの数を尋ねる最も効率的な方法は何ですか?

MethodInfo がパラメーターを受け入れるかどうかを尋ねる最も効率的な方法は何ですか?また、受け入れる場合はいくつですか?

私の現在の解決策は次のとおりmethodInfo.GetParameters().Any()ですmethodInfo.GetParameters().Count()

これが最も効率的な方法ですか?

私は実際にはオブジェクトを必要としないのでParameterInfo、を呼び出さずにこれを行う方法はありますGetParameters()か?

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

c# - "get_Item" MethodInfo を取得する最適化された方法

今、私は持っています:targetType.GetMethod("get_Item", BindingFlags.Instance)

もっと良いものはありますか?

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

c# - リフレクション付きのメソッド本体の読み方

反射のあるメソッド本体について何かを知ることは可能ですか?

どのように?

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

c# - メソッドの MethodHandle をキーとして使用して、パラメーターなしのメソッドの結果をキャッシュしても安全ですか?

GetAllFoo()WCF クライアント アプリケーションには、結果をキャッシュしたいパラメーターなしのメソッドが多数ありますGetAllBar()。これらはドロップダウンなどに入力するために使用され、結果はクライアントの実行中は変更されません。

これらの結果は現在、リソース ファイルに格納されている一意の文字列によってキャッシュされています。たとえば、リソースGetAllCountries()に対してキャッシュされていCountryKeyます。このサービスは、要求されたキーがキャッシュに含まれていない場合にのみ呼び出されます。

これは問題ありませんが、リソース ファイルでキーを維持する必要があり、すべてのメソッドが正しいキャッシュ キーを使用していることを確認する必要があります。そうしないと、問題が発生します。古い Control+C、Control+V はここでいくつかの頭痛の種を引き起こします。このメソッドを呼び出すすべての場所をチェックする必要はありません。

だから質問:

serviceCallデリゲートには、実行Methodするメソッドを記述するプロパティがあります。MethodHandleこれは、プロパティを含む MethodInfo インスタンスです。MethodHandleプロパティが参照されるメソッドを一意かつ一貫して識別すると仮定するのは正しいですか?

ラッパーを次のように変更します

これにより、キャッシュと重要な問題が適切にカプセル化され、「正しいことを行う」呼び出し元への依存がなくなります。

  • MethodHandle がインスタンス間で変更されても気にしないでください - キャッシングはインスタンスごとにのみ行われます
  • MethodHandle がクライアント間で一貫していなくてもかまいません - キャッシングはクライアントごとです
  • MethodHandleがクライアントのインスタンス内で一貫していない場合は注意してください。実際には、すべてのリクエストで新しいサービスが呼び出され、キャッシュが未使用のデータでいっぱいになるのではなく、キャッシュを使用する必要があります。
  • MethodHandleがクライアントのインスタンス内で一意でない場合は注意してください。ラッパーを使用するときに正しいデータ (および型) が返されるようにする必要があります。
0 投票する
1 に答える
154 参照

c# - .NETで_MethodInfoインターフェイスがIMethodInfoと呼ばれないのはなぜですか?

私はちょうどタイプを読んでいて、MethodInfoこのタイプに出くわし、最初はある種の管理されていないクラスであると思いました。次に、それが実際にはインターフェースであることがわかりました。

なぜ名前が付けられなかったのか誰もが知っていIMethodInfoますか?Iインターフェイスにプレフィックスを付けることは、.NETの標準的な方法だと思いました。名前の衝突が原因ですか?

0 投票する
0 に答える
116 参照

c# - ac#パーサーを使用してメソッドシグネチャの行番号を取得します

この質問に多く関連しています: フィールド用

これは、メソッドの行番号を取得する方法を説明しています。ただし...このアプローチを使用してメソッド内のステートメントの行番号を取得することしかできません。メソッドシグネチャの行番号とその長さを取得するにはどうすればよいですか?

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

c# - MethodInfo.Invokeを使用してWin32DLLとC#の間でLPSTRを渡す

Win32DLLの関数を呼び出せるようにする必要があるプロジェクトに取り組んでいます。ただし、DLLの名前、関数、およびすべての引数のデータ型と戻り型はコンパイル時に不明であるため、DLLImportを使用することはできません。基本的に、このルーチンは、任意のDLL内の任意の関数を実行可能に呼び出し、任意の引数を渡すことができます。多くの検索を行った後、関数に数値と文字列を渡したり、参照によって数値引数を渡したりするなど、これを実行できるコードをうまくまとめることができました。しかし、DLLから文字列を返そうとしてレンガの壁にぶつかりました。

テストを簡素化するために、Visual Studio 6を使用して、次の1つの関数を含むPassCharPtr.dllという単純なWin32DLLをコンパイルしました。

PassCharPtr.defファイル:

PassCharPtr.hファイル:

PassCharPtr.cppファイル:

DLLをテストするために、単純なVB6アプリケーションを作成しました。

すべてがうまく機能しています。これが、この関数にアクセスしようとするVS2010のC#テストプロジェクトです。

最初の引数をchar[](System.String)として宣言すると、文字列を関数に正常に渡すことができますが、DLLがその文字列を返す文字列に置き換えようとすると、例外(保護されたメモリへのアクセス)が生成されます。

最初の引数をLPSTR(System.IntPtr)として宣言すると、関数に文字列を渡すことができません。ただし、呼び出しから戻ると、argValuesArray[0]にはアドレスのように見えるものが含まれています。そのアドレスを返された文字列に変換する方法をまだ理解できていません。String mvValue = Marshal.PtrToStringAnsi((IntPtr)argValuesArray [0])を使用してみましたが、空の文字列が返されます。

このコードにはまだ多くの穴がありますが、一般的な考え方が十分に明確であることを願っています。この関数に文字列を正常に渡したり、この関数から文字列を渡すことができるように最初の引数を宣言する必要があるデータ型と、そのデータ型で必要な変換を行う方法を教えてもらえますか?

0 投票する
3 に答える
3551 参照

c# - MethodInfo.Invoke メソッドによって返される値の型を適切な型に変換する方法は?

structメソッドを使用して、 を返すメソッドを呼び出したいと思いますMethodInfo.Invoke。ただし、このメソッドの返される変数の型はobjectであり、 にキャストすることはできませんstruct

( から に切り替える提案と同様に、ここで見つけましstructclasshttp://msdn.microsoft.com/en-us/library/b7tch9h0(VS.90).aspx )

では、呼び出されたメソッドの (値) 結果を適切な型にキャストするにはどうすればよいでしょうか?

(単純なキャストも試しましたが、InvalidCastException がスローされました)

ここに私のコードのいくつかのチャンクがあります:

皆さん、ありがとうございました!

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

c# - Enumerable.DefaultIfEmptyのmethodinfoを取得します

私はいくつかのLinq式を作成していて、IEnumerable.DefaultIfEmptyhttp://msdn.microsoft.com/en-us/library/bb360179.aspx)のMethodInfoを取得しようとしています。簡単な作業のように見えましたが、なぜそれが機能しないのかわかりません。

0 投票する
3 に答える
3949 参照

c# - C#でリフレクションを使用してメソッドを呼び出すときに、パラメータの自動型変換を行う方法は?

C# を使用して、リフレクションを通じて型のメソッドを呼び出す必要があります。

実行時に、データは名前と値のペアを含む Dictionary で構成されます。Dictionary 内の名前は、呼び出すメソッドのパラメーター名に対応します。また、実行時に、任意のアセンブリ修飾型名とメソッド名を持ちます。設計時には、メソッドが int、string、DateTime、bool、int[]、string[]、DateTime[]、または bool 型の可変数のパラメーターを受け入れること以外に、型とメソッドについての知識はありません。 []。

リフレクションを使用して型のインスタンスを作成し、メソッドを呼び出すことができるようになるまで問題はありません。呼び出すときに、辞書内の文字列値をメソッドで必要な適切な型に変換する必要がある時点で立ち往生しています。

おそらく MethodInfo.GetParameters() を介して列挙し、各パラメーターの型変換を実行する必要があることはわかっています。私が理解しようとしているのは、これを行う方法、そして理想的には効率的に行う方法です。

私のこれまでの調査では、フォームの値を ActionMethod に渡すときに MVC ソース コードが同様のことを行うため、MVC ソース コードを掘り下げました。ActionMethodDispatcherを見つけましたが、慣れていない LINQ 式を使用しています。

SOに関する同様の質問も見ましたが、私の質問に答えるものは見つかりませんでした。

解決策への指針を歓迎します。