起初我只是在做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语句容易一些但是仍然可能很难确保所有内容都在监听,如果有很多不同类型的消息并且同时检查它们,也会看到问题时间。
有更好的方法可以做到这一点吗?
答案 0 :(得分:2)
有一种常用的方法不仅更方便,而且还可以在运行时配置(而if
/ else
或等效的switch
只能配置在编译时间):制作一个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
。