取得の呼び出し側のメソッド名から内法による複製]
-
03-07-2019 - |
質問
可能な重複:
かにすることができますので、方法という現在の方法は?
い方法でオブジェクトから呼び出される多数の場内のオブジェクトです。り早くに位置するこのメソッドの名前となるこの人気の方法です。
擬似コードの例:
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()
いの価値 Main
から呼び出された場合には Main
...してもらいたいです"ButtonClick
"の場合 PopularMethod()
と呼ばれたから ButtonClick
私は見る System.Reflection.MethodBase.GetCurrentMethod()
なく、呼び出し方法。私の場合の近似式は以下のようにな StackTrace
クラスがまったく気付きませんをご賞味走行全体のスタックトレースは毎回このメソッドが呼び出されます。
解決
とは思わないだけでなくトレースのスタックです。しかし、このシンプルなものになる:
StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.
しかし、私は思って停止さいことが必要です。
他のヒント
ます。純4.5/C#5、これはシンプルです:
public void PopularMethod([CallerMemberName] string caller = null)
{
// look at caller
}
の コンパイラ 追加の呼び出し側の名前は自動的にい:
void Foo() {
PopularMethod();
}
通 "Foo"
.
これは実際に本当に簡単です。
public void PopularMethod()
{
var currentMethod = System.Reflection.MethodInfo
.GetCurrentMethod(); // as MethodBase
}
に注意してくださいを通じて、私は少し懐疑的に合inliningの影響はありません。これまでに付けられることがないよう、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();
}
通り過ぎるパラメータ
public void PopularMethod(object sender)
{
}
IMO場合でもイベントです。
私はしばしば見つかり自分たいということも予想リファクタリングデザインのシステムでんこ"尾太犬の"anti-パターンです。その結果、常により強固なのです。
ることができますしながら、最も疲れ様、スタックで、そういういう考え設計されるようお願いします。場合の方法を知る必要がある種の"状態"んじゃないでしょうかだけを列挙型は何か、そのパラメータとしてごPopularMethod().何かをされるようになっています。どん投稿、トレースのスタックが失わせないアイテムと思う。
と思う必要はありません。をご利用 StackTrace
クラスとして StackFrame.GetMethod()
次のフレーム。
このような不思議なものを使用 Reflection
のためのものです。の場合の定義 PopularMethod
, ですので、碁を定義するパラメータまたは何かの情報ました。(または、基底クラスまたは何か...)