1

Fooメソッドを持つクラスがありSomeMethod()ます。でSomeMethod()、私は実行します:Bar bar = new Bar(); bar.BBQ();。内で、メッセージとともに例外をスローするBBQ()プライベートメソッドを呼び出します。Name(n)new StackTrace().GetFrame(n).GetMethod().Name

私の意図は、Name(n)に1を渡して、値「BBQ」を返すようにすることです。ただし、Name(0)は「Name」を返し、Name(1)は「SomeMethod」を返します。スローされた例外の結果として生じるスタックトレースでは、NameがSomeMethodによって直接呼び出されたかのようにも読み取られます(BBQについては言及されていません)。

これを回避する方法はありますか?誰かがこのエラーを引き起こしている可能性があるものを知っていますか?Nameから値「BBQ」を取得するためのより良い方法はありますか?

[TestClass]
public class Foo
{
    public Foo()
    {
    }
    [TestMethod]
    public void SomeMethod()
    {
        Bar bar = new Bar();
        bar.BBQ();
    }
}

public class Bar
{
    public Bar()
    {
    }
    public void BBQ()
    {
        Name( 1 );
    }
    private void Name( int n )
    {
        throw new Exception( new StackTrace().GetFrame(n).GetMethod().Name );
    }
}
4

1 に答える 1

5

メソッドが JIT コンパイラーによってインライン化されていることが問題であると強く思います。おそらく、デバッガー内でデバッグ ビルドを実行し、問題が解決するかどうかを確認することで、これを確認できます。

即時呼び出しメソッドは比較的簡単に取得できますが、デバッガー以外の環境で完全に正確なスタック トレースを取得することは不可能だと思います。結局のところ、インライン化を無効にしたくないでしょう。

于 2012-06-16T18:51:44.210 に答える