65

オブジェクト内のさまざまな場所から呼び出されるオブジェクト内のメソッドがあります。この人気のあるメソッドを呼び出したメソッドの名前をすばやく簡単に取得する方法はありますか?

疑似コードの例:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

から呼び出された場合PopularMethod()の値を確認したい ... から呼び出された場合の" " を確認したいMainMainButtonClickPopularMethod()ButtonClick

を見ていましたSystem.Reflection.MethodBase.GetCurrentMethod()が、呼び出し方法がわかりません。私はStackTraceクラスを見てきましたが、そのメソッドが呼び出されるたびにスタックトレース全体を実行するのは本当に好きではありませんでした.

4

7 に答える 7

184

.NET 4.5 / C# 5 では、これは簡単です。

public void PopularMethod([CallerMemberName] string caller = null)
{
     // look at caller
}

コンパイラは呼び出し元の名前を自動的に追加します。それで:

void Foo() {
    PopularMethod();
}

を渡し"Foo"ます。

于 2013-01-02T13:08:21.680 に答える
79

スタックをトレースしないとできないと思います。ただし、それを行うのはかなり簡単です。

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.

しかし、本当に立ち止まって、これが必要かどうかを自問する必要があると思います.

于 2009-03-05T18:29:32.637 に答える
17

これは実際には非常に簡単です。

public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod(); // as MethodBase
}

メソッドをインライン化しても効果があるかどうかについては、私は少し懐疑的です。これにより、JIT コンパイラが邪魔にならないようにすることができます。

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod();
}

呼び出しメソッドを取得するには:

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    // 1 == skip frames, false = no file info
    var callingMethod = new System.Diagnostics.StackTrace(1, false)
         .GetFrame(0).GetMethod();
}
于 2009-03-05T18:27:37.633 に答える
5

パラメータを渡すだけです

public void PopularMethod(object sender)
{

}

IMO:イベントに十分であれば、これにも十分なはずです。

于 2009-03-05T18:30:12.307 に答える
4

私は自分自身がこれをやりたいと思っていることがよくありますが、常にシステムの設計をリファクタリングすることになるので、この「犬の尻尾を振る」アンチパターンは得られません。その結果、常により堅牢なアーキテクチャが実現されています。

于 2012-07-25T12:16:35.323 に答える
1

ほとんどの場合、スタックをトレースしてそのように把握することができますが、設計を再考することをお勧めします。メソッドがある種の「状態」について知る必要がある場合は、列挙型などを作成し、それをPopularMethod()のパラメーターとして取得します。それらの線に沿った何か。投稿内容に基づいて、スタックをトレースするとIMOが過剰になります。

于 2009-03-05T18:34:28.927 に答える
0

StackTraceクラスを使用StackFrame.GetMethod()してから次のフレームで使用する必要があると思います。

しかし、これは奇妙なことに使用するようReflectionです。を定義しているPopularMethod場合、本当に必要な情報を渡すためのパラメータなどを定義することはできません。(または基本クラスか何かに入れて...)

于 2009-03-05T18:34:24.920 に答える