1

起初我只是在做 if 语句来检查发送的对象的类型,但如果你有一堆不同类型的消息对象,那可能会很痛苦。然后我想,我做了一个被调用的事件,然后当某种类型正在侦听该事件并且当它被调用时它会检查它时,每个函数都会做某事。

if 语句的方式

   //code for after message received - if you need the code for listening for the message i can give it but i don't see a need
   Type msgType = msgObj.getType();
   if(msgType == messageType1){
        //do stuff
   }
   else if(msgType == messageType2){
        //do more stuff
    }
   // and so on

如您所见,如果您有很多不同类型的消息,这可能会很糟糕

事件的方式

   private delegate messageEvent(object message);
   public event messageEvent onMessage;

   //code after message received
   onMessage(msgObj);


   // sample function that will listen for the onMessage event
   private void onMessage(object message){
        if(message.getType() == typeForThisFunction){
              //do somthing
        }
   }

正如您所看到的,这比 if 语句要容易一些,但要确保所有内容都在听,并且如果有很多不同类型的消息并同时检查它们,也会发现问题。

有没有更好的方法来做这件事更容易?

4

1 回答 1

2

有一个常用的方法,不仅更方便,而且还可以在运行时配置(而if/else或等价物switch只能在编译时配置):make a Dictionary.

var dict = new Dictionary<Type, Action<object>>
           {
               { typeof(SomeMessage), m => this.Process((SomeMessage)m) },
               { typeof(OtherMessage), m => this.Process((OtherMessage)m) },
           };

字典中的值只是一个例子,你可以根据你的要求选择不同的方法。

与基于事件的方法类似的其他方法也是有效的。例如,您可以让您的业务逻辑保留如下类对象的集合:

 interface IMessageProcessor
 {
     bool WantsToHandle(MessageBaseClass message);
 }

 class SomeMessageProcessor : IMessageProcessor { /* ...*/ }
 class OtherMessageProcessor : IMessageProcessor { /* ...*/ }

MessageBaseClass应该包含有关消息“类型”的信息;当然,您可以只传递object和过滤对象的运行时类型,但这会更慢。当消息到达时,您依次将其提供给每个IMessageProcessor人。

于 2012-04-06T16:19:33.300 回答