2010-02-22 3 views
5

다른 응용 프로그램에서 사용할 클래스 라이브러리를 작성 중입니다. C# .NET에서 작성했습니다. 클래스 전체에서 이벤트를 트리거하는 데 문제가 있습니다. 여기에 ... 내가해야 할 일이다 나는이 작업을 수행하는 클래스 라이브러리를 사용하는 응용 프로그램에서 다음수업 전반에 걸쳐 일정을 어떻게 시작합니까?

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 

    public ClassLibrary() 
    { 
     // do some stuff 
     OtherClass.Start(); 
    } 
} 

public class OtherClass : Form 
{ 
    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      // THIS IS WHERE I WANT TO TRIGGER THE DEVICE ATTACHED EVENT IN ClassLibrary 
      // I can't seem to access the eventhandler here to trigger it. 
      // How do I do it? 

     } 
     base.WndProc(ref m); 
    } 

} 

...

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 

답변

1

저는 이벤트가 어떻게 작동하는지에 대한 관점을 바꾸어야한다고 생각합니다. OtherClass는 이벤트를 소유하고 트리거해야합니다. ClassLibrary 또는 ClientApplication (선택에 따라 다름)은 이벤트에 "가입"하여 이벤트를 "수신"하고이 이벤트가 발생할 때 특정 작업을 수행합니다.

방법이 구현 :

public class ClassLibrary 
{ 
    public OtherClass myOtherCl; 

    public ClassLibrary() 
    { 
     myOtherCl= new OtherClass(); 
     myOtherCl.Start(); 
    } 
} 

트리거가 발견되는 경우가 논리적으로 일어나는 클래스의 이벤트입니다. myOtherCl이 예에서 공개 한 이유

public class OtherClass : Form 
{ 
    public event EventHandler DeviceAttached; 

    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      OnDeviceAttach(); 
     } 
     base.WndProc(ref m); 
    } 

     public void OnDeviceAttach() 
     { 
      if (DeviceAttached != null) 
       DeviceAttached(); 
     } 

} 

마지막으로, 누구든지 이벤트가 이벤트를 개최하는 클래스의 인스턴스에 대한 액세스를 필요로 듣는 필요, 즉.

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.myOtherCl.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 
+0

제쳐두고, 스레드 안전을 위해 이벤트 처리기를 시작하기 전에 복사해야합니다.'var ev = DeviceAtached; if (ev! = null) ev();' – Tanzelax

8

당신은이 작업을 수행 할 수 없습니다. 이벤트는 이벤트를 선언 한 클래스 내에서만 제기 할 수 있습니다.

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 
    public void NotifyDeviceAttached() 
    { 
     // Do processing and raise event 
    } 

그런 다음, 다른 코드에서, 당신은 단지 myCL.NotifyDeviceAttached();

+0

NotifyDeviceAttached가 정적이어야합니까? 그렇지 않으면 OtherClass가 클래스 라이브러리를 만들지 않았을 때 어떻게 OtherClass에서 ClassLibrary의 인스턴스를 참조 할 수 있습니까? – PICyourBrain

+0

양식을 적절한 인스턴스와 함께 제공해야합니다. 그렇지 않으면 NotifyDeviceAttached를 정적으로 만들 수 있지만 이벤트 핸들러를 정적 이벤트로 만들어야합니다. 모두 디자인의 문제입니다. –

1

이벤트 호출 것 : 일반적으로

, 당신은 방법을 이벤트를 인상 클래스의 메소드를 추가하고 전화 것 핸들러는 선언 한 클래스에 의해서만 직접 호출 될 수 있습니다. 당신은 그 클래스 외부에서 ClassLibrary.DeviceAttached를 호출해야하는 경우 다음과 같은 유틸리티 메소드를 추가해야합니다

public void OnDeviceAttached() 
{ 
    DeviceAttached(); 
} 
+0

흠. 이벤트를 레퍼런스로 클래스에 전달하고 그런 식으로 호출 할 수 있습니까? – PICyourBrain

+0

@Jordan S : 아니요. C# 디자이너가 의도적으로 그것을 만들었으므로 다른 클래스 (심지어 하위 클래스)에서 이벤트를 발생시킬 수 없습니다. 반드시 이벤트를 선언 한 클래스에서 수행해야합니다. –

+0

OnDeviceAttached가 정적이어야합니까? 그렇지 않으면 OtherClass가 클래스 라이브러리를 만들지 않았을 때 어떻게 OtherClass에서 ClassLibrary의 인스턴스를 참조 할 수 있습니까? – PICyourBrain

1

당신은 모두 여기에 이벤트를 사용할 수 없습니다. 이것은 지나치게 단순화 된 것이지만, 일반적으로 이벤트는 부모 컴포넌트와 통신해야 할 때 하위 컴포넌트가 발생시키는 이벤트입니다. 귀하의 사례에서 (귀하의 코드에서 추측하겠습니다) 귀하의 양식이 특정 메시지 (장치가 부착되었을 때)를 듣고 있으며, 그 메시지가 얼룩이지면 myCL에게 그 사실을 알릴 필요가 있습니다. 이를 위해 ClassLibrary에 메소드를 작성하고 양식에서 호출하십시오.

+0

제 예제는 많은 세부 사항을 생략합니다. OtherClass는 실제로 볼 수있는 형식이 아니며, Form에서 상속되므로 USB 장치가 연결/수신 될 때 Windows 메시지를 수신하는 데 사용할 수 있습니다 ... 혼란 스럽습니다. – PICyourBrain

관련 문제