4


2

C#では、クラスやメソッドがだれかを知る方法はありますか。 どのクラス/メソッドがそれを呼び出した?

たとえば、

クラスa {public void test(){b temp = new b();}ストリング出力= temp.run(); }}

クラスb {パブリック文字列run(){**コードはこちら**}}

出力:「クラス 'a’の 'test’メソッドによって呼び出されました。」

5 Answer


13


StackFrame

var frame = new StackFrame(1);

Console.WriteLine( "クラス '{1}'のメソッド '{0}'によって呼び出されました。、frame.GetMethod()、frame.GetMethod()。DeclaringType.Name);


2


スタックトレースを調べて、誰が呼び出したのかを判断できます。


1


あなたは System.Diagnostics.StackTraceを作成して調べることができます。


0


次の式はあなたに呼び出しメソッドを与えるでしょう。

新しい StackTrace().http://msdn.microsoft.com/ja-jp/library/system.diagnostics。 stacktrace.getframe.aspx [GetFrame(1)] .http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stackframe.getmethod.aspx [GetMethod()]


0


Jimmyが示唆しているように、StackFrameがそれを行います。 ただし、StackFrameを使用するときは注意してください。 インスタンス化するのはかなりコストがかかります。インスタンス化する場所によっては、MethodImplOptions.NoInliningを指定する必要があります。 スタックウォークをまとめて呼び出し先の呼び出し元を完全な関数で見つけるには、次の手順を実行する必要があります。

[MethodImpl(MethodImplOptions.NoInlining)]
public static MethodBase GetThisCaller(){StackFrame frame = StackFrame(2); //直接の呼び出し元ではなく、//呼び出したいメソッドの呼び出し元を取得する。// MethodBase method = frame.GetMethod();メソッドを返す。 }