2013-05-21 4 views
0

위임자 기반 이벤트 처리에서 매개 변수로 명시 적으로 지정하지 않고 '보낸 사람'참조를 보낼 수 있습니까? 대표자를 보내지 마십시오

나는 몇 가지 이벤트를 발생시키는 내부 클래스를 가지고 있고 테스트 목적을 위해 명시 적으로 이벤트를 호출합니다. 핸들러 방법은 보낸 사람의 참조를 사용 할 필요가있는 경우

public class Manager { 
    public class DataStruct { 
     public int Id { get; private set; } 
     public event EventHandler Event1; // Can't be called by other classes 
     public void fireEvent1(Event1();} // So another caller... 

     // Delegates *can* be called by other classes 
     public delegate void DelegateHandler(DataStruct sender); 
     public DelegateHandler NewEvent; 

     public void DelegateHandler(DataStruct sender) { 
      MessageBox.Show(string.Format(
       "{0} raises event", sender.Id)); 
     } 
    } 
} 

// Form1 /////////////////////////////////////////////////////////////////// 
partial class Form1 { 
    Manager.DataStruct dsRaiser, dsListener; 

    private void Form1_Load(object sender, EventArgs e) { 
     dsRaiser.Event1 += dsListener.SOME_HANDLER; 
     dsRaiser.NewEvent += dsListener.DelegateHandler; 
    } 
    private void button1_Click(object sender, ...) { 
     dsRaiser.fireEvent1(); // No argument needed but fireEvent1, not Event1(). 
    } 
    private void button2_Click(object sender, ...) { 
     dsRaiser.NewEvent(dsRaiser); // Way to omit parameter dsRaiser? 
    }   
////////////////////////////////////////////////////////////////////////// 
+0

당신은 내부로'Event1'를 표시 할 수 있습니까? –

+0

어쩌면 단위 테스트의 요점을 놓치고 싶지만 대신에'DataStruct' (혼란스럽게도'class'입니까?)가 발생하는 조건/트리거를 테스팅하지 말고 이벤트 _forcing_보다는 이벤트 자체를 발생시켜야합니다 발사? 시험을 치러야 할 대상은 무엇입니까? –

답변

1

, 당신은 그 참조를 전달해야합니다. 그렇지 않은 경우 Action처럼 void 매개 변수없는 대리자를 선언하십시오.

이벤트를 생각할 때 해당 매개 변수는 이벤트 자체를 발생시키는 클래스에 의해 전달되어야합니다. (이벤트가 외부에서 호출되는 것은 아닙니다). 당신이 정말로 이벤트 대신 간단한 대리자를 사용하려면

그래서, 당신은 매개 변수를 전달해야합니다. 보낸 사람이 필요한 경우 이벤트와 정확히 일치해야합니다. 대리인을 "발생시키는"메서드를 만들고 해당 메서드에서 this을 보낸 사람으로 전달합니다.

하지만 두 경우 모두 정확히 같은 일을해야 할 고려, 나는 확실히 이벤트를 사용하십시오.

public class DataStruct { 
    public int Id { get; private set; } 
    public event EventHandler Event1; // Can't be called by other classes 

    // you need to pass those parameters to the event when called. 
    public void fireEvent1{Event1(this, new EventArgs());} 

    // Delegates *can* be called by other classes, but only with all parameters passed. 
    public delegate void DelegateHandler(DataStruct sender); 
    public DelegateHandler NewEvent; 

    // To avoid passing parameters, you need to do exactly what you did with the event 
    public void RaiseDelegate() { NewEvent(this); } 

    public void DelegateHandler(DataStruct sender) { 
     MessageBox.Show(string.Format(
      "{0} raises event", sender.Id)); 
    } 
} 
관련 문제