リフレクション/診断を介してメソッド内から呼び出しインスタンスを取得できますか?
-
01-07-2019 - |
質問
System.Reflection、System.Diagnostics、またはその他を介して、メソッド自体に渡さずに静的メソッドを呼び出している実際のインスタンスへの参照を取得する方法はありますか?
たとえば、次のようなことです
class A
{
public void DoSomething()
{
StaticClass.ExecuteMethod();
}
}
class B
{
public void DoSomething()
{
SomeOtherClass.ExecuteMethod();
}
}
public class SomeOtherClass
{
public static void ExecuteMethod()
{
// Returns an instance of A if called from class A
// or an instance of B if called from class B.
object caller = getCallingInstance();
}
}
を使用して型を取得できます System.Diagnostics.StackTrace.GetFrames, ですが、実際のインスタンスへの参照を取得する方法はありますか?
私は、リフレクションとパフォーマンスの問題、および静的呼び出しと静的呼び出しに関する問題を認識しています。また、これは一般的に、おそらくほぼ普遍的に、これに対処するための正しい方法ではないことを認識しています。この質問の理由の 1 つは、それが実行可能かどうか知りたかったからです。現在、インスタンスを渡しています。
ExecuteMethod(instance)
そして、これが可能でありながらインスタンスにアクセスできるのかどうか疑問に思いました。
ExecuteMethod()
@スティーブ・クーパー:拡張方法は考えていませんでした。それのいくつかのバリエーションは機能するかもしれません。
解決
そんなことができるとは思えません。StackTrace クラスや StackFrame クラスでも、名前付け情報が提供されるだけで、インスタンスへのアクセスは提供されません。
なぜこれを行う必要があるのか正確にはわかりませんが、たとえそれができたとしても、おそらく非常に時間がかかることを知っておいてください。
より良い解決策は、ExecuteMethod を呼び出す前に、インスタンスをスレッド ローカル コンテキストにプッシュすることです。ExecuteMethod 内で取得することも、単にインスタンスを渡すこともできます。
他のヒント
メソッドを拡張メソッドにすることを検討してください。次のように定義します。
public static StaticExecute(this object instance)
{
// Reference to 'instance'
}
それは次のように呼ばれます:
this.StaticExecute();
あなたがやりたいことを直接行う方法は思いつきませんが、何かを見つけた場合は、インスタンスを持たない静的メソッドとインスタンスを持つ匿名メソッドに注意することだけを提案します。これは少し奇妙になります。
呼び出し元のオブジェクトを適切なパラメータとして渡すべきかどうかは疑問です。結局のところ、 static
これは、このメソッドが入力パラメーター以外には依存しないことを示しています。また、作成するテスト コードは実行中のシステムと同じ呼び出しオブジェクトを持たないため、このメソッドはテストするのが難しい場合があることに注意してください。
静的メソッドが静的メソッドを呼び出す場合、呼び出し元のインスタンスはありません。
あなたがやろうとしていることを達成するための別の方法を見つけてください。
ExecuteMethod にオブジェクトを取得させるだけです。そうすれば、何があってもインスタンスを手に入れることができます。
ここで何かが足りないような気がします。静的メソッドは文字通りどこからでも呼び出すことができます。クラス A またはクラス B のインスタンスがコール スタックのどこかに現れるという保証はありません。
あなたがやろうとしていることを達成するには、もっと良い方法があるはずです。