메소드 내에서 호출 메소드 이름 검색 [복제
-
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.
그러나 나는 당신이 정말로 멈추고 이것이 필요한지 스스로에게 물어봐야한다고 생각합니다.
다른 팁
.NET 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
}
그러나 조심하십시오. 나는 방법이 어떤 영향을 미치는지에 대해 약간 회의적입니다. 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 : 이벤트에 충분하다면 충분해야합니다.
나는 종종 내 자아가 이것을하고 싶어한다는 것을 알았지 만, 항상 내 시스템의 디자인을 리팩토링하게 만들었 으므로이 "Tail Wagging the Dog를 흔들어"방지를 얻지 못했습니다. 결과는 항상 더 강력한 아키텍처였습니다.
가장 정의 된 스택을 추적하고 그런 식으로 알아낼 수는 있지만 디자인을 다시 생각할 것을 촉구합니다. 방법이 일종의 "상태"에 대해 알아야한다면, 나는 열거 나 무언가를 만들어 인기있는 method ()의 매개 변수로 가져갑니다. 그 줄을 따라 뭔가. 게시 한 내용에 따라 스택 추적은 과잉 IMO가됩니다.
나는 당신이 그것을 사용해야한다고 생각합니다 StackTrace
수업 및 그 다음 StackFrame.GetMethod()
다음 프레임에서.
이것은 사용해야 할 이상한 것 같습니다 Reflection
그래도. 당신이 정의하는 경우 PopularMethod
, 실제로 원하는 정보를 전달하기 위해 매개 변수 또는 무언가를 정의 할 수 없습니다. (또는 기본 클래스 나 뭔가에 넣으십시오 ...)