2011-01-16 4 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

이 코드는 다음과 같은 모호한 문자열을 반환합니다 : <Main>b__0.익명 메소드에서 MethodInfo.GetCurrentMethod() 사용

익명 메소드를 무시하고 더 읽기 쉬운 메소드 이름을 얻을 수있는 방법이 있습니까?

+6

그리고 당신은 _anonymous_ 방법에 대한 어떤 이름을 기대합니까? –

+0

나는 MS anon에 대한 원한을 품지 않는다. 메서드 이름 생성자. 가장 가까운 비 익명 메소드의 스택 추적을 파고가는 방법이 있는지 궁금한가요? MethodInfo 인스턴스가 익명임을 알 수있는 방법이 있습니까? – HuBeZa

답변

6

당신은 외부를 캡처 할 수 있습니다 :

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

; 아니.

+0

예. 캡쳐 된 변수가 가장 좋고 가장 간단한 솔루션이라고 생각합니다. – HuBeZa

6

아니요, 없습니다. 그래서 익명의 방법입니다. 이름은 컴파일러에 의해 자동으로 생성되며 고유 한 것으로 보장됩니다. 당신이 호출 메소드 이름을 얻고 싶은 경우에 당신은 인수로 전달할 수 :

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

또는 당신이 정말로 의미있는 이름을 원한다면 당신은 그것을 제공해야합니다 :

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

불행히도 제 3 자 API이기 때문에 매개 변수를 전달할 수 없으며이를 위해 포장하고 싶지는 않습니다. 스택 트레이스를 파는 방법이 있습니까? 'MethodInfo' 인스턴스가 익명임을 알 수있는 방법이 있습니까? – HuBeZa

+2

@HuBeZa, 당신은 MethodInfo가'[CompilerGenerated]'속성으로 장식되어 있는지 테스트 할 수 있습니다. 이것은 필수 조건이며 익명 메소드가 될 수 있지만 좋은 조건은 아니지만 좋은 조건입니다. 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), true);' –

3

익명 메소드가있는 함수의 이름을 얻으려면 스택을 이동하고 호출하는 메소드의 이름을 가져올 수 있습니다. 이 방법은 원하는 메소드 이름이 계층 구조에서 한 단계 위로 올라간 경우에만 작동한다는 점에 유의하십시오. 익명으로 접근 할 수 없을 때까지 여행하는 방법이 있을지 모릅니다. 자세한 내용은

은 다음을 참조하십시오 http://www.csharp-examples.net/reflection-calling-method-name/

관련 문제