문제

가능한 복제 :
현재 방법이라고 불리는 메소드를 어떻게 찾을 수 있습니까?

나는 물체 내의 여러 곳에서 호출되는 객체에 메소드가 있습니다. 이 인기있는 방법이라고 불리는 방법의 이름을 얻는 빠르고 쉬운 방법이 있습니까?

의사 코드 예 :

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, 실제로 원하는 정보를 전달하기 위해 매개 변수 또는 무언가를 정의 할 수 없습니다. (또는 기본 클래스 나 뭔가에 넣으십시오 ...)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top