你如何跨课程触发事件?

时间:2010-02-22 20:51:30

标签: c# class delegates event-handling

我正在编写一个将被其他应用程序使用的类库。我是用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...
    }
}

4 个答案:

答案 0 :(得分:8)

你不能这样做。事件只能从声明事件的类中引发。

通常,您需要在类上添加一个方法来引发事件,并调用方法:

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

然后,在您的其他代码中,您只需致电myCL.NotifyDeviceAttached();

答案 1 :(得分:1)

事件处理程序只能由声明它们的类直接调用。如果您需要从该类外部调用ClassLibrary.DeviceAttached,则需要添加如下所示的实用程序方法:

public void OnDeviceAttached()
{
    DeviceAttached();
}

答案 2 :(得分:1)

您可能根本不想在此处使用活动。这是一个过于简单化的过程,但通常事件是由子组件在需要将某些内容传递回其父组件时引发的事件。在您的情况下(我从您的代码推断),您的表单正在侦听特定消息(当设备连接时?),当它发现该消息时,它需要告诉myCL它。为此,您只需在ClassLibrary中创建一个方法,然后从表单中调用它。

答案 3 :(得分:1)

我认为你应该改变你对事件如何运作的看法。 OtherClass应该“拥有”事件并触发它。 ClassLibrary或ClientApplication(无论你选择哪个)通过“订阅”来“监听”事件,并在发生此事件时执行某项操作。

如何实现:

public class ClassLibrary
{
    public OtherClass myOtherCl;

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

在逻辑上发生的类中触发事件,检测到它。

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 ();
        }

}

最后,无论谁需要监听事件都需要访问持有事件的类的实例,这就是myOtherCl在此示例中公开的原因。

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...
    }
}