2012-01-14 2 views
4

의 첫 번째 메소드 이름을 가져올 수 없습니다.는이 코드를 멀티 캐스트 위임

그리고는 지금은 콘솔에 각 메소드의 이름을 인쇄 할, 그래서 나는이 만든 :

public void Show() 
{ 
    int count = 1; 
    string name = null; 

    Console.WriteLine(m_Title); 
    foreach (FuncInvoker list in d_Lines.GetInvocationList()) 
    { 
     name = list.Method.Name; 
     Console.WriteLine((count++) + ". " + name); 
    } 
} 

문제는 항상 어떤 이유로 "호출"인쇄 첫 번째 방법 이름입니다. 대리자 링크의 다음 메서드는 정상적으로 작동합니다.

누군가가 도와 줄 수 있습니까? 나는 모든 것을 시도했다. 이 라인에서

+0

앱을 현지화하기로 결정한 경우이 방법에 문제가 있습니다. – Groo

답변

5

:

d_Lines = new FuncInvoker(i_FuncToAdd); 

... 당신이 실제로 원래의 대리자를 감싸는 새로운 위임 인스턴스를 생성하고 있습니다. 이 새로운 대리자의 메서드 - 대상은 원래 대리자의 Invoke 메서드입니다 (유니 캐스트라고 가정 함). 관찰중인 동작을 설명합니다.

확실한 해결 방법은 래퍼를 사용하고 단지 변수에 원래의 위임에 대한 참조를 복사하지 않는 것입니다 :

d_Lines = i_FuncToAdd; 

그러나 당신은뿐만 아니라 완전히 떨어진 '특별한 경우'분기 할 수 있으며 단지 할 (인수를 가정하는 것은 null 될 수 없습니다) :

public void AddMenuRow(FuncInvoker i_FuncToAdd)      
{ 
    d_Lines += i_FuncToAdd; 
} 

이 첫 번째 경우 두 번째 위임에 대한 참조를 반환하는 speced되는합니다 (+= 구문이 될 것입니다) Delegate.Combine 때문에 잘 작동합니다 예외를 throw하는 것이 아니라 대리자가 null입니다.

+0

와우 !! 그것은 그?! 고마워요 정말 많이 갇혀 있어요 :) – moshe

+0

유일하게 주목해야 할 점은 첫 번째 접근 방식이 다른 "메뉴 항목"에 동일한 "메뉴 항목"을 추가하는 것이 원래의 위임을 수정한다는 것입니다. 작동하지 않습니다. 망할 안드로이드 키보드. :-) – Groo

+0

@moshe : 간단한 List가 ** 멀티 캐스트 대리인보다 ** 항목 목록을 저장하는 작업에 적합 할 것이라고 확신합니다. 나는 당신이 잘못된 도구를 선택했다고 생각합니다. – Groo