【问题标题】:Responding to custom event if raised from different classes如果从不同的类引发,则响应自定义事件
【发布时间】:2016-12-16 07:58:04
【问题描述】:

这更像是一个设计问题,我希望我能清楚地表达我的问题。
我有一个复杂的过程,需要记录消息。当其中一些日志被写入时,会引发一个事件,我需要对此做出响应。

问题是在此过程中从不同的类调用 CreateLog 方法,目前我的代码仅捕获从第一个类 (MyForm) 引发的事件。

是否有更好的设计让我可以响应该类的所有事件?

希望下面的伪代码能对我的问题有所启发。

文件 1:

Class CreateLog
{
   Log Message
   Raise event
}

文件 2:

Class MyForm
{
   private CreateLog _log = new CreateLog();
   void StartProcess()
   {
       Do stuff
       Call _log.LogMessage  //1
       Call MethodB()
       Call MethodC()
   }

   void MethodB()
   { 
       Call _log.LogMessage  //2
   }

   void RespondToEvent
   {
       //Show Progress on screen
   }
}

文件 2:

Class AnotherClass
{
    void MethodC()
    {
        _log2.LogMessage()  //3
    }
}

因此,当我运行此程序时,nr 1 和 2 处的消息日志将触发 RespondToEvent() 方法,但显然不会在 nr 3 处触发,因为它是 CreateLog 类的不同实例。 一种解决方案是将 _log 作为参数传递给 MehodC,但这并不是最好的解决方案。

除了将所有内容添加到 1 个类中之外,还有其他干净的方法吗?

【问题讨论】:

  • 如果您有两个不同的日志类实例,会阻止您有两个不同的事件处理程序来处理日志
  • 有效问题:File2 中的类是需要更新进度条/表格的 Winforms。 File3 可以从 File2 和 File4 中调用。 File4 需要更新其他内容。所以,是的,AnotherClass 可以有它自己的事件处理程序,但是它的行为应该与调用它的位置不同。

标签: c# events


【解决方案1】:

您可以将事件添加到 AnotherClass 并在 MethodC 中引发该事件。并在 MyForm 中处理事件并调用 _log.LogMessage

例子:

Class MyForm
{
    //your code

    RespondToEventFromAnotherClass()  //handles delegateToForm Event from 'AnotherClass'
    {
        Call _log.LogMessage
    }
}
Class AnotherClass
{
    Event delegateToForm;
    void MethodC()
    {
        _log2.LogMessages(); // you can Eleminate this line if it is not necessary
        Raise Event delegateToForm
    }
}

【讨论】:

  • 有趣。这是一种可能。会试试的。
  • 仔细想想,还有不止 1 个“AnotherClass”。这意味着 MyForm 和 MyForm2-x 需要订阅几个事件。可能会变得“混乱”,但仍然是一种选择,谢谢。
  • 是的,但您可以让所有“AnotherClass”订阅相同的方法。这将保持代码干净。
猜你喜欢
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多