2009-08-07 12 views
3

.NETでリフレクションを使用して、自分のメソッドを呼び出すオブジェクトにアクセスしたいと思います。スタックトレースを表示することは何とかできます。私はそれがさまざまな理由で安全ではないことを知っていますが、私はちょうどいくつかのプロパティ値をつかんで、カタログする必要があります。C#リフレクションを使用してスタックトレース上のオブジェクトにアクセスする

どうすればよいですか?

更新:私は馬鹿、私はこれはC#の

+1

http://stackoverflow.com/a/10530629/8155 –

答えて

2

静的メソッドは、あなたが何を呼び出す場合にあったと言うのを忘れていますか?

発信者が自分を渡した場合、より良い(より簡単な)契約になるとは限りませんか?

+0

もちろん、私は呼び出し元のライブラリを制御することはできません。私はコマンドヒストリーのLaunchyプラグインを書いていますが、そのプラグインモデルはやや柔軟性に欠けています。私は誰が電話をしているのか知っている、私はそれにアクセスするための何らかの方法が必要だ –

2

あなたはここに

のStackTrace &たStackFrameクラスを使用することができます。これは、 "メイン"

class Program 
{ 
    static void Main(string[] args){ 
     Func(); 
    } 
    static void Func(){ 
     StackFrame frame = new StackFrame(1); 
     StackTrace trace = new StackTrace(frame); 
     var method = frame.GetMethod(); 
     Console.WriteLine(method.Name); 
    } 
} 
+0

素晴らしい情報は、それを知らなかった。しかし、私のメソッドを呼び出すインスタンスに関する情報が本当に必要です。 –

+0

StackFrameオブジェクトコンストラクタを使用して、コールスタックに含めるレベルの整数を渡す必要があります。たとえば、新しいStackFrame(1)は呼び出し元StackFrameを意味します(2)呼び出し元の呼び出し元 – bashmohandes

5
var methodInfo = new StackFrame(1).GetMethod(); 
を印刷する必要がありますたとえば、あるMSDN

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

の例であります

呼び出すメソッドを返します。現在のメソッドを編集しました。

コンパイラでは、メソッドの呼び出しをインライン化または最適化することができます(ただし、そうでないと思われるかもしれませんが)。これは期待される動作を妨げます。これは、コンパイラがその仕事をすることが可能に反すること

[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] 

注意:安全のために、とあなたの方法を飾ります。買い手責任負担。

はおっと EDITED、私はあなたのメソッドを呼び出したインスタンスを望んでいることがわかります。その情報を得る方法はありません。

+0

応答に感謝します。理論上VSデバッガにアクセス可能な情報のすべてに私がアクセスできるはずはありませんか?デバッガは、メソッドを呼び出したインスタンスでスタックフレームをルックアップできます。 –

+0

このレベルの詳細を取得するには、おそらくデバッガとしてプロセスにアタッチする必要があります。 http://stackoverflow.com/questions/420541/is-there-any-way-to-get-a-reference-to-the-calling-object-in-cを参照してください。 –

関連する問題