2011-06-29 11 views
2

を探す私はこのようなC#の機能を持っている:機能の実行者

private void test(){} 

は、実行または関数の呼び出し元を見つける方法はありますか?例えば

private void Caller(){ 
test(); 
} 

が、その後どのように私はテストが発信者によって呼び出されたことを理解することができますか?あなたは、発信者の使用試験(1)からテストを呼び出すときに別の関数から呼び出すとき

+2

は、Visual Studioの_FindすべてReferences_を参照している:あなたは、次を使用することができますスタックトレースを取得するには

?または、実行時に関連していますか? –

+0

あなたのロジックがあなたの発信者に依存する場合、それはあなたのクラスの別の方法でなければなりません。彼らは間違いなく異なる行動です。あなたがデバッグトレースや何かStackTraceのために行きたい場合は、trace = new StackTrace();あなたのものを手に入れてください。 – Peter

答えて

2

コールスタックからメソッドの名前を取得できます。

関数を呼び出すと、他の情報と同じ名前がスタックにプッシュされ、プログラムはその関数呼び出しからの復帰方法を認識します。この情報を使用して、test()関数を呼び出した以前の関数を取得することができます。

StackTrace stackTrace = new StackTrace(); 
StackFrame[] stackFrames = stackTrace.GetFrames(); 

Console.WriteLine(stackFrames[1].GetMethod().Name);  
+1

あなたは間違いなく@TheSuperTramp(+1 BTW)によって提供されるリンクを見る必要があります。あなたが何をしても、可能な限りすべての方法で非常に徹底的にテストしてください。これは非常に多くの状況であなたを噛んでしまう可能性が高いです。デバッグとリリースのビルドは異なった動作をする可能性がありますが、デバッグする際には別の経験になるかもしれません。 [Jon Skeetの答え](http://stackoverflow.com/questions/6108584/how-to-get-invoker-class-of-this-method/6108600#6108600)とコメントを追加して参考にしてください。 – takrl

+0

良い点tarkrl!それはメソッド名を取得する簡単な方法でした。どのプロダクションコードでもそれを使用することはお勧めしません。メソッド名を変更するとどうなりますか? – OsQu

+0

Do not ask me :)これを使ってみましたが、Debug/Releaseのビルドに問題がありました。より信頼性の高いものを実現するための他の方法があります。しかし、私がこの種の質問を見るたびに、私はJon Skeetの答えを指摘します。それはそれがとてもうまくいっているからです。 – takrl

1

を参照してくださいtest.likeを呼び出すanotherCallerから言うテストを使用(2)

1

あなたは、文字列引数はテストするためにすることができ、

private void test(string whoCalled){} 

場合で、呼び出し元では、

private void Caller() { 
    test("Caller"); 
}