2008-09-20 6 views
12

어떤 상황에서도이 작업을 수행 할 수 있습니까?소유 클래스 외부에서 C# 이벤트를 호출합니까?

나의 현재 상황이 있습니다 :

internal enum GUIElementHandlers { Click, ... } 
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) { 
    switch (h) { 
     case Click: 
      this.Click(this, (EventArgs)args[0]); 
      break; 
     ... // etc and so forth 
    } 
} 

그것은 무섭게 추한 kludge하지만 그것은 ...이 수행해야 작동합니다 : 내 첫번째 생각은 유사한 기능을 가지고 있었다

public class CustomForm : Form 
{ 
    public class CustomGUIElement 
    { 
    ... 
     public event MouseEventHandler Click; 
     // etc, and so forth. 
    ... 
    } 

    private List<CustomGUIElement> _elements; 

    ... 

    public void CustomForm_Click(object sender, MouseEventArgs e) 
    { 
     // we might want to call one of the _elements[n].Click in here 
     // but we can't because we aren't in the same class. 
    } 
} 

그래도 더 우아한 솔루션이 될까요? .NET 라이브러리는 메시지 처리기와 Control의 호출 이벤트로 항상 이것을 수행합니다. 다른 사람이 다른 어떤 아이디어가 있습니까?

답변

24

이벤트를 호출하기위한 공용 메소드를 추가하기 만하면됩니다. Microsoft는 이미 과 같은 일부 이벤트에 대해이 작업을 수행합니다. 을 노출하는 컨트롤의 경우을 클릭하십시오. 이벤트를 클릭하십시오.

그런 다음 귀하의 예제 이벤트 핸들러 내에서 다음을 수행 할
public class CustomGUIElement  
{ 
    public void PerformClick() 
    { 
     OnClick(EventArgs.Empty); 
    } 

    protected virtual void OnClick(EventArgs e) 
    { 
     if (Click != null) 
      Click(this, e); 
    } 
} 

...

public void CustomForm_Click(object sender, MouseEventArgs e)   
{ 
    _elements[0].PerformClick(); 
} 
+1

나는 그가 사건 수업 외부에서 사건을 제기하는 것을 고려한다고 생각하니? –

+1

Events 클래스 외부에서 PerformClick()을 호출합니다. –

+0

아니요, 이것은 제가하고 싶은 스타일입니다. 즉. 이벤트 클래스 외부에서 이벤트를 호출합니다. 방법을 피할 수있는 방법이 있기를 바랬습니다. 내가 게시 한 내부 솔루션과 함께 갈 것이라고 가정합니다.이 사용자 지정 양식은 DLL에 있으므로 내부 항목은 숨겨집니다. –

1

실제로 메소드에서 외부에서 실행할 수 있도록하려는 코드를 래핑해야합니다. 그런 다음 해당 메서드는 이벤트가 수행하는 모든 작업을 수행 할 수 있으며 해당 이벤트는 대신 해당 메서드를 호출합니다.

+0

효과가 있습니다. 가난하지만 작동 할 수 있습니다. 콜백 목록을 저장하는 것은 본질적으로 이벤트가 어쨌든하는 일입니다. 이미 존재하는 것을 다시 구현하려는 노력은 왜해야합니까? –

7

C#에서 이벤트 키워드는 대리자의 선언을 수정합니다. 대리자에 대한 직접 할당을 방지합니다 (이벤트에는 + = 및 - = 만 사용할 수 있음). 그러면 클래스 외부에서 대리인이 호출되지 않습니다.

그래서 당신은 다음과 같이 당신의 코드를 변경할 수 :

public class CustomGUIElement 
{ 
... 
    public MouseEventHandler Click; 
    // etc, and so forth. 
... 
} 

그런 다음이 같은 클래스 외부에서 이벤트를 호출 할 수 있습니다.

myCustomGUIElement.Click(sender,args); 

의 단점은 다음과 같이 코드를 아주 쉽게, 등록 된 핸들러를 덮어 쓸 수 클래스를 사용하여 해당 코드입니다, 클릭 대리자 이벤트로 선언 된 경우 허용되지 않습니다

myCustomGUIElement.Click = null; 

.

+0

나는 그것에 대해 그렇게 생각하지 않았습니다. 다른 대답은 여전히 ​​실용적이지만 통찰력에 감사드립니다. –

+0

이 답변은 내가 배우고 싶었던 것입니다. 고맙습니다. @Lee – uzay95

관련 문제