2011-10-13 3 views
3

Unity에서 Mono 프로그래밍으로, 다른 Monobhaviour 객체를 Update() 시스템에 연결하기 위해 Action 이벤트를 사용하여 다른 Action 대리자를 보유하고 있습니다. 그냥 "System.Action"를 반환 ...Action.ToString()은 "System.Action"이외의 다른 것을 반환 할 수 있습니까?

Delegate[] actions = updateActions.GetInvocationList(); 
foreach (Delegate del in actions) { 
    Debug.Log(del.ToString()); 
} 

: 내가 좋아하는 뭔가를 사용하여 디버그 콘솔 액션의 이름을 인쇄 할 수 있기를 좋아하지만 것입니다. 나도 행운을 빌어 (Action as del) .ToString()을 시도했다.

+0

'작업 이름'이란 무엇입니까? – sll

답변

5

Method 속성을 사용하면 MethodInfo이라는 유용한 이름을 가져올 수 있습니다. 당신은 단지 이름을하려는 경우 서명 또는 del.Method.Name을 원하는 경우

Delegate[] actions = updateActions.GetInvocationList(); 
foreach (Delegate del in actions) 
{ 
    Debug.Log(del.Method.ReflectedType.FullName + "." + del.Method.Name); 
} 

당신은 del.Method.ToString()를 사용할 수 있습니다. del.Method.ReflectedType.FullName는 유형 이름을 제공합니다.

lambda/익명 메소드의 경우 컴파일러에서 생성 된 이름 만 있으므로 이름이 유용하지 않을 수 있습니다. 현재 구현에서 람다의 이름은 <Main>b__0과 같습니다. 여기서 Main은 람다를 포함하는 메소드의 이름입니다. 형식 이름과 함께 이것은 람다가 당신에게보기 흉하지 않은 아이디어를 줄 것입니다. 당신이 대리인

var foo = new Action(() => { /* do something */ }); 

를 선언한다는 것을 의미하고 단어 "foo는"을 검색 할 경우

+0

나에게 좋은 해결책 인 것 같습니다. –

+0

위대한 작품 - 감사합니다! –

1

후, 당신은 운입니다. 이 동작을 얻으려면 선언을 표현식 트리로 사용하고 foo을 구문 분석해야합니다.

+0

'() => {/ * do something * /}'부분을 (디버그 목적으로) 가져 오려면 어떻게해야합니까? – Joel

+1

정확한 텍스트 (예 : 댓글)를 가져올 수 없지만 그 람다를 '표현식 '에 할당하고 AST를 가져올 수 있습니다. 기본적인 개요는 http://msdn.microsoft.com/en-us/library/bb397951.aspx를 참조하십시오. – mquander

+0

고마워요, 선생님. +1 – Joel

관련 문제