問題タブ [methodbase]
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.
.net - ジェネリックで MethodBase を区別する方法
私はに基づいてキャッシュを持っています
キーは MethodBase.GetCurrentMethod からレンダリングされます。メソッドが明示的に宣言されるまで、すべてが正常に機能しました。しかし、ある日、次のことが明らかになりました。
T がまったく異なる型を取得した場合、辞書に同じエントリを作成します。
したがって、私の質問は、ジェネリック メソッドの値をキャッシュするより良い方法についてです。(もちろん、GetCache を提供するラッパーを提供することはできますが、ジェネリック型に遭遇した場合は同等ですが、この方法はエレガントに見えません)。
ここで私が正確に欲しいものを更新してください:
.net - MethodBase のジェネリック パラメータを検出する
この質問は、ジェネリックで MethodBase を区別する方法の続きです
簡単に言うと、異なるジェネリック型の置換のために呼び出されたときに、辞書で同じジェネリック メソッドを区別する必要があります。
そのため、IEqualityComparer をオーバーライドして、MethodBase 引数を引数ごとに比較しました。また、デバッグ中に、ジェネリック メソッドの実際の型の引数を検出する方法がないことに疑問を感じました。GetGenericArguments も GetParameters も、実際の型の呼び出しを提供しません。私は正しいですか?もしそうなら、最初の行 Environment.StackTrace で比較する以外の方法はわかりません - このメソッドだけが引数の型を調べるからです。
c# - コンストラクターで MethodBase の Invoke を呼び出す (リフレクション)
まず、これが以前に尋ねられた場合は申し訳ありません。私はかなり包括的な検索を行いましたが、それとまったく同じものは見つかりませんでしたが、何かを見落としている可能性があります.
そして今、質問に: リフレクションを介してコンストラクターを呼び出そうとしていますが、運がありません。基本的に、複製したいオブジェクトがあるので、その型のコピー コンストラクターを検索し、それを呼び出します。ここに私が持っているものがあります:
上記のメソッドを次のように呼び出します。
ここで、私が使用している呼び出しメソッドが の呼び出しであることに注意してMethodBase
ください。ConstructorInfo
次のように呼び出された場合に機能する呼び出しメソッドを提供します。
ただし、 のメソッドを使用したいMethodBase
のは、実際にはコピー コンストラクターを辞書に格納するたびに検索するのではなく、辞書にメソッドとコンストラクターの両方が含まれているため、Dictionary<MethodBase>
ではなくDictionary<ConstructorInfo>
です。もちろんConstructorInfo
、上記のようにキャストすることもできますが、キャストを避けてMethodBase
メソッドを直接使用したいと思います。正しいパラメータがわかりません。
何か助けはありますか?本当にありがとう。
編集
ベンジャミン、
あなたの提案に感謝します。私は実際にあなたが2番目の編集で提案したことを正確に行っていました.
そして、辞書で見つけたものについてClonerMethod
'sを呼び出しました。invoke
私が探していた答えは、ConstructorInfo
usingMethodBase
のInvoke
メソッドで Invoke を呼び出す方法だけだったので、それらすべてを処理するコードを追加しませんでした。読んでください。しかし、私はあなたの使い方がFunc<,>
ずっと良いと思うので、そちらに切り替えます。また、Clone
メソッドをジェネリックにするのは良い追加ですが、私の場合、呼び出し元はオブジェクトの型を知らないので、代わりに非ジェネリックのままにします。
私は について知らなかったしFunc<,>
、忘れていたラムダ演算子について知っていれば(以前はこのようなものは本当に必要ではなかった)、実際にあなたの答えから多くのことを学びました。私はいつも新しいことを学ぶのが大好きで、これは将来とても役に立ちます。どうもありがとうございました! :)
c# - MethodBase.GetCurrentMethod()パフォーマンス?
次のコードのように、ログクラスと関数を記述しました。
何かをログに記録するたびに、methodBase.NameとmethodBase.DeclaringType.Nameからクラス名もログに記録します。
Get CurrentMethodを使用して次の投稿を読みましたが、このメソッドが遅いことに気付きました。
System.Reflection.MethodBaseの代わりにthis.GetType()を使用する必要がありますか、それともLog( "ClassName.MethodName"、 "log message)などのクラス/メソッド名を手動でログに記録する必要がありますか?ベストプラクティスは何ですか?
c# - リフレクション付きのメソッド本体の読み方
反射のあるメソッド本体について何かを知ることは可能ですか?
どのように?
c# - メソッドの MethodBase オブジェクトを取得するには?
この投稿にあるクラスを使用しようとしていますが、実行するには MethodBase が必要です。
MethodBaseオブジェクトを取得する最速の方法は何ですか? しかし、私は解決策を得ることができませんでした。
私がする必要があるのは、関数から MethodBase オブジェクトを取得することです。
たとえば、クラス Console の静的関数 WriteLine() の MethodBase を取得するか、List<> の非静的関数 Add() の MethodBase を取得します。
ご協力いただきありがとうございます!
c# - メソッドパラメータに値を代入
次のシグネチャを持つメソッドを想像してください。
の値に応じて、 の値を、、または何もdata
割り当てない必要があります。要するに、もしそうならA
B
C
id
id == "A"
A = data;
問題は、このメソッドの本体が人間によって型付けされているのに、署名が実行時に生成されることです。このため、設計時に ref パラメーターがいくつあり、それらが何と呼ばれるかが不明であるため、ロジックをハードコーディングすることはできません。このコード片は、任意の数のメソッドに挿入でき、それぞれが異なる署名を持つ可能性があり、すべてのメソッドで機能する必要があります。
現在使用されているメソッドのすべてのパラメーターを取得する方法は知っていますが、これらのパラメーターの 1 つに値を割り当てる方法がわかりません。私が探しているのは、次のようなものです。
c# - MethodBody.LocalVariables カウントがわかりにくい
次のようなローカル変数のない単純なメソッドの場合
MethodInfo.GetMethodBody().LocalVariables.Count = 2 のカウント なぜ? 別の switch ステートメントを追加すると、カウントが 3 になります なぜ?
ローカル変数は定義されていません。では、なぜ 2 と 3 なのか。また、j を指定した別の switch ステートメントがカウントを 2 に保つ場合。
c# - メソッドが PInvoke を使用しているかどうかを確認する
メソッドが PInvoke を使用しているかどうかを確認する方法はありますか? MethodBase を使用してアセンブリ内のすべてのメソッドをループしていますが、メソッドが PInvoke を使用しているかどうかを確認したいと考えています。ここに私が使用しているコードがあります:
また、可能であれば、使用されている DLL と呼び出されている関数/エントリポイントを確認する方法はありますか?
c# - 実際のメソッド/タスク名の代わりに MoveNext
次のように宣言された log4net を使用します。
次のような非同期メソッドまたはタスクで:
MoveNext
の代わりにログを記録しCheckSomething
ます。実際のメソッド名をログに記録する方法はありますか?