2012-04-06 1 views
1

처음에는 송신 된 객체의 유형을 확인하기 위해 if 문을 수행하는 중이었지만 여러 유형의 메시지 객체가있는 경우 실제로 고통이 될 수 있습니다. 그런 다음 생각하고 나는 특정 유형이 그 사건을 듣고 그것이 그것을 검사 할 때 무언가를하는 각각의 함수라고 부르는 사건을 만들었다.메시지가 tcp 소켓을 통해 recived 될 때 유형 검사를 수행하는 더 좋은 방법이 있습니까?

와 방법은 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 
     } 
    } 

로와 방법의 differnt 한 종류 많이있는 경우이 빨 수 있습니다 볼 수 있습니다 당신은 이것이 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을 전달하고 객체의 런타임 유형을 필터링 할 수는 있지만 느려질 수 있습니다. 메시지가 도착하면 각각 IMessageProcessor에 메시지를 제공합니다.

+0

첫 번째 설명을 좀 더 자세히 설명해 주실 수 있습니까? 나는 사전을 사용 해본 적이 없다. 사전에 각 유형에 대해 호출해야하는 프로세스를 추가하고 유형을 키로 사용하는 것처럼 보입니다. 그 후에 당신은 무엇을하나요? – Shredder2500

+1

@ Shredder2500 : 메시지를 받고 그것에'.GetType()'을 수행하십시오; 그러한 키가 존재하는지 확인하기 위해 결과를 사용하십시오; 그렇다면 해당 값 (함수)을 가져 와서 메시지를 매개 변수로 전달하십시오. 사전을 사용하는 방법에 대한 자세한 내용은 MSDN을 참조하십시오. – Jon