2012-04-06 25 views
1

起初我只是在做if語句來檢查發送的對象的類型,但如果你有一堆不同類型的消息對象,那麼這可能是一個真正的痛苦。然後我想,我做了一個被調用的事件,然後每個函數在某個類型正在監聽該事件時執行某些操作,並在其被調用時進行檢查。當通過tcp套接字接收消息時,是否有更好的方法來進行類型檢查?

與方式的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語句容易一些,但是仍然會很痛苦,以確保一切都在監聽,並且如果存在大量不同類型的mes聖人,並讓他們同時檢查。

有沒有更好的方式做到這一點,更容易?

回答

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並過濾對象的運行時類型,但這會更慢。當消息到達時,您依次將其提供給每個。

+0

你能解釋第一個多一點嗎?我以前從未使用過Dictionary。它看起來像你將一個應該爲每種類型調用的過程添加到一個字典中,並將該類型用作關鍵字。那之後你做了什麼? – Shredder2500 2012-04-10 00:28:23

+1

@ Shredder2500:您收到一條消息,並在其上執行'.GetType()';使用結果來檢查這樣的密鑰是否存在;如果是這樣,獲取相應的值(這是一個函數)並調用它,將消息作爲參數傳遞。有關如何使用字典的更多信息,請參閱MSDN。 – Jon 2012-04-10 07:08:23

相關問題