2013-10-02 3 views
0

동적으로 생성 된 LinkButton에 페이지의 메서드를 바인딩하는 메서드가 있습니다.이벤트에 대리자를 동적으로 바인딩

protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance, 
      string methodName, string eventName) 
{ 
    Delegate d = null; 

    EventInfo ei = controlInstance.GetType().GetEvent(eventName); 

    Type tDelegate = ei.EventHandlerType; 

    MethodInfo method = page.GetType().BaseType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance); 

    if (method != null) 
     d = Delegate.CreateDelegate(tDelegate, page, method); 
    else { 
     FieldInfo field = page.GetType().BaseType.GetField(methodName, BindingFlags.NonPublic | BindingFlags.Instance); 

     if (field != null) 
     { 
     d = field.GetValue(page) as Delegate; 
     } 
    } 

    MethodInfo addHandler = ei.GetAddMethod(); 
    object[] addHandlerArgs = { d }; 
    addHandler.Invoke(controlInstance, addHandlerArgs); 
} 

이는 해당 페이지 내부의 메소드에 적용됩니다. 내가 추가하고 싶은 것은 사용자 컨트롤 내부의 메소드를 지원하는 것입니다. 그래서 페이지 코드 숨김 뒤에 delegate을 만들고 런타임에 사용자 정의 컨트롤 메서드를 할당합니다.

내가 만들고과 같이 대리자를 할당 : 다음

protected event PrintPageMethod PrintPage; 
protected delegate void PrintPageMethod(object sender, EventArgs e); 

과 : 코드는 방법을 찾으려고

이 하나가 발견되지 않을 때 시도

PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage; 

을위한 필드를 찾을 수를 대리자를 찾아 올바른 컨트롤을 가리키는 올바른 컨트롤을 대상으로 사용합니다.

문제 addHandler.Invoke(controlInstance, addHandlerArgs); 도달했을 때, 그것은 '은 System.EventHandler를'형태로 변환 할 수없는 예외로 형 'SomePage + PrintPageMethod'의

개체가 발생한다는 것이다.

내가 뭘 잘못하고 있는지 알 수 없습니다.

protected event PrintPageMethod PrintPage; 
protected delegate void PrintPageMethod(object sender, EventArgs e); 

사용 : 대신

+0

전체 사용자 정의 컨트롤 표시 (이벤트 관련 사항) – jgauffin

+0

@jgauffin - usercontrol 코드를 추가했지만 대리자가 함수에 대한 포인터이기 때문에 함수 자체를 표시하는 관련성을 알 수 없습니다. 예외는 함수를 대리자에 할당하는 것이 아니라 대리자를 이벤트 hanlder에 할당하는 것과 관련이 있습니다. –

답변

1

유사한 서명에도 불구하고

protected event EventHandler PrintPage; 

, 위임 유형는 다르다.

+0

해결 방법이 아닌 해결 방법 인 것 같습니다. 이 코드는'PrintPage' 이벤트가'PrintPageMethod' 타입을 가지고 있고'PrintPageMethod' 델리게이트를 생성 한 것으로 보입니다. – hvd

+0

감사! 이벤트 해결 방법 (그리고 왜 여전히 대리자를 사용하여 작동하지 않았다 이해할 수없는 경우) 내 문제를 해결합니다. –

1

다른 대리인에게 대리인을 보낼 수 없습니다.

d = field.GetValue(page) as Delegate; 

Delegate orig = field.GetValue(page) as Delegate; 
d = Delegate.Combine(
    orig.GetInvocationList() 
    .Select(_ => Delegate.CreateDelegate(tDelegate, _.Target, _.Method)) 
    .ToArray() 
    ); 

에 당신은 .Target.Method에서 호출 대상을 사용하여 다른 Delegate을 만들 수 있으며, 위임 많은 타겟이 경우, 각 대의원을 결합했습니다.

관련 문제