如何从不同的类中引发相同的事件

本文关键字:事件 | 更新日期: 2023-09-27 18:09:53

我有一个类库,里面有很多类。这些类中的任何一个都应该能够在任何时间点向客户端发送消息(字符串(。我想要一个可以从多个类中引发的泛型事件。我不希望每节课都有单独的活动。

类似这样的东西:

public class GenericEvent
{
    // Here I have an event.   
}
public class LibClass1
{
    //Raise event here.
}
public class LibClass2
{
    //Raise event here
}
public class Client
{
  //Subscribe to the event here
}

这是正确的方法吗?如果是,如何实现?我查到的例子中,每个类都有一个单独的事件。

如何从不同的类中引发相同的事件

这取决于这个事件是什么和用例,但其中一个选项是使用继承:

public class GenericEvent
{
    // Here I have an event.
    protected void RaiseEvent();
}
public class LibClass1 : GenericEvent 
{
    public voidDoSomethingAndRaiseEvent()
    {
        // ...
        RaiseEvent();
    }
}

INotifiPropertyChanged通常就是这样实现的。

如果继承是不可能的,并且您正在使用聚合,那么LibClass1LibClass2应该充当GenericEvent的一些facade/decorator:它们必须有自己的事件,该事件将调用重定向到GenericEvent的事件和方法以引发它:

public class GenericEvent
{
    public event EventHandler SomeEvent;
    // ...
}
public class LibClass1
{
    private readonly GenericEvent _ge;
    // ...
    public event EventHandler SomeEvent
    {
        add { _ge.SomeEvent += value; }
        remove { _ge.SomeEvent -= value; }
    }
    public void DoSomethingAndRaiseEvent()
    {
        // ...
        SomeEvent?.Invoke(this, EventArgs.Emtpy);
    }
}
    public class MyEventArgs : EventArgs
    {
        // class members
    }
    public abstract class Lib
    {
        public event EventHandler ShapeChanged;
        public virtual void OnShapeChanged(MyEventArgs e)
        {
            if (ShapeChanged != null)
            {
                ShapeChanged(this, e);
            }
        }
    }
    public class LibClass1 : Lib
    {
        //Raise event here.
    }
    public class LibClass2 : Lib
    {
        //Raise event here
    }
    static void Main(string[] args)
    {
        LibClass1 lib1 = new LibClass1();
        LibClass2 lib2 = new LibClass2();
        lib1.ShapeChanged += Lib1_ShapeChanged;
        lib2.ShapeChanged += Lib1_ShapeChanged;
        lib1.OnShapeChanged(new MyEventArgs());
    }

这里的完整示例创建了一个抽象类,您在其中拥有事件。

我会处理继承。例如:

public class ParentClass : Form
{
    public ParentClass() {
        this.FormClosed += sendString;
    }
    private void sendString(object sender, FormClosedEventArgs e)
    {
        throw new NotImplementedException();
    }
}
public class GenericEvent : ParentClass { }
public class LibClass1 : ParentClass { }
public class LibClass2 : ParentClass { }
public class Client : ParentClass { }

现在,你们所有的冲突都有ParentClass事件。

我有另一种方法。

从一个基类派生所有的类。(当然,任何库都可以这样做,.net、MFC、Qt或java框架(。

基类中只有一个事件"event1"。在事件1处理程序中,引发"事件2"。

将您的所有子类订阅到父类的"event2",并在相应的子类中处理您的业务。