2010-05-24 4 views
1

를 사용하지 않고 열거 값에 따라 다른 방법을 호출 나는 다음과 같은 코드가 있습니다스위치

public void ParseNetworkPacket(IAsyncResult iResult) 
    { 
     NetworkConnection networkConnection = (NetworkConnection)iResult.AsyncState; 

     string teste = NetworkPacketType.ToString(); 

     switch (this.NetworkPacketType) 
     { 
      case NetworkPacketType.ShotPacket: 
       break; 
      case NetworkPacketType.ShotResponsePacket: 
       break; 
      case NetworkPacketType.ChatMessagePacket: 
       break; 
      default: 
       break; 
     } 

     networkConnection.BeginReadPacket(); 
    } 

NetworkPacketType 날에 의해 정의 된 열거입니다. 스위치에서 열거 형의 유형에 따라 다른 메서드를 호출합니다. 너무 많은 열거 형이있을 수 있기 때문에 스위치를 사용하지 않는 것을하고 싶습니다. 다른 방법이 있습니까? 또는 가능한 유일한 방법은 enum입니까?

+0

전환 명령문은 조건이 많은 경우에 가장 적합합니다. 귀하의 모범에 "너무 많은"이 몇 개나 있습니까? – JYelton

+0

아직 확실하지는 않지만 그 중 많은 부분이있을 수 있습니다. 단지 좀 더 "일반적인"방식으로하고 싶습니다. – Gabriel

+0

가상 메서드가있는 클래스 계층 구조는 어떻습니까? –

답변

1

Veer가 링크 된 답변에서 제안한대로지도를 사용하는 것 외에도 리플렉션을 사용할 수 있습니다. 당신은 예를 들어 열거 값처럼 방법 이름을 할 경우, 다음과 같이 할 수있다 :

public void ParseNetworkPacket(IAsyncResult iResult) 
    { 
     NetworkConnection networkConnection = (NetworkConnection)iResult.AsyncState; 

     string teste = NetworkPacketType.ToString(); 

     string methodName = this.NetworkPacketType.ToString(); 

     MethodInfo methodInfo = GetType().GetMethod(methodName, 
      BindingFlags.Instance | BindingFlags.NonPublic); 

     methodInfo.Invoke(this, /* your arguments here */); 

     networkConnection.BeginReadPacket(); 
    } 

private void ShotPacket() 
{ 
    .... 
} 

하지만 난 정말이 방법 절대적으로이 켜지지 아니라면 권하고 싶지 않다. 이것을 유지하는 것이 고통스런 일이 될 수 있습니다.