在 C# 中获取事件以处理公共数据对象

本文关键字:处理 公共数据 对象 事件 获取 | 更新日期: 2023-09-27 18:35:28

我在 C# 中实现事件体系结构时遇到了一些问题。基本布局是这样的:

我们有一个与服务器通信的网络层(dll)。该层为数据库中的更改事件提供了多个接口。数据库字段更改,dll 调用我的相应接口的实现。我有一个GUI,在它的主要方法中有一个数据对象,它存储我显示的临时数据列表,直到我的用户更改某些内容,在这种情况下,我会将更改发送到数据库。

现在的问题是我无法在网络层中实现事件处理程序,或者我无法实现其接口,因为我的数据对象(应该获取事件的结果)仅存在于我的 GUI 中,并且它是 main 方法,因此不知道适当的对象。

我将以伪代码为例:

命名空间客户端连接{    public class DataListener : IDataListener    {        public delegate void SomethingReceivedHandler(对象发送者,SomethingData packet);        公共事件 SomethingReceivedHandler somethingReceivedevedHandler;        公共无效 某物接收(某物数据包)        {            if (SomethingRecievedHandler != null)            {                SomethingRecievedHandler(this,packet);            }        }

是我当前实现的接口。该图层类似于:

私有 void ProcessPacket(SomethingData packet)        {            如果(数据包 == 空)                返回;            尝试            {                如果(数据包是某事数据)                    DataListener.SomethingReceived(packet as SomethingData);剪 断

我的主要方法是:

公共部分类 主 : 窗体主    {        数据客户端数据;包含 GUI 中的所有临时数据        public frmMain()        {            客户端数据 = 新数据();            DataListener dataListener = newDataListener();            初始化组件();        }

如果事件触发,我想执行以下操作: ClientData.SomeList.Add(packet)取决于上下文。

在 C# 中获取事件以处理公共数据对象

现在的问题是我无法在网络层中实现事件处理程序,或者我无法实现其接口,因为我的数据对象(应该获取事件的结果)仅存在于我的 GUI 中,并且它是 main 方法,因此不知道适当的对象。

不确定我是否看到问题。事件的发布者不需要知道有关事件订阅者的任何信息,这就是它们有用的原因。

根据您的伪代码,它应该像以下那样简单:

public partial class Main : FormMain
{
    Data ClientData; //Contains all temporary data within the GUI
    public frmMain()
    {
         ClientData = new Data();
         DataListener dataListener = new DataListener();
         // Add an event handler
         dataListener.somethingReceivedHandler += 
             (object sender, SomethingData packet)              
             {
                if (someContext) ClientData.SomeList.Add(packet); 
             };
         InitializeComponent();
    }

您可能希望将dataListener提升到字段(而不是本地字段),以便它在 ctor 之外保持活动状态(您可以在表单关闭时取消订阅)。