2012-05-03 3 views
0

우리는 클래스가 const를 필드 사용하여 속성을 추가 'SomeClass'С 번호는

namespace Namespace 
{ 
    class SomeClass 
    { 
     // something 
    } 
} 

그리고 속성 'SomeAttribute'

class SomeAttribute : System.Attribute { } 

작업 : 모든 클래스 시장에 추가 SomeAttribute '대중 const string Type '필드에 있습니다. 수정 된 클래스는 다음과 같은해야합니다

class SomeClass 
{ 
    // something 
    public const string Type = @"Namespace.SomeClass"; 
} 

UPD :

class Manager 
{ 
    // message has 3 parts: 
    // string message = String.Format("{0}{1}{2}", 
    //  typeof(SomeClass).ToString(), 
    //  splitter, 
    //  Manager.Serialize(someClassObj) 
    //) 
    public static string GetType(string message) { /* some code */ } 
    public static string Serialize(SomeClass message) { /* XML serialization */ } 
    public static SomeClass Deserialize(string message) { /* deserialization */ } 
} 

class Logic 
{ 
    public void ProcessMessage(string message) 
    { 
     switch (Manager.GetType(message)) 
     { 
      case SomeClass.Type: 
       { 
        SomeClass msg = Manager.Deserialize(message) as SomeClass; 
        // send message to binded objects 
       } 
       break; 
      case ClassInheritedFromSomeClass.Type: 
       { 
        // the same 
       } 
       break; 
      // etc. 
     } 
    } 
} 

UPD : 2 : 메시지에 대한

더 내가 메시지 트랜잭션에 대한 접근 방법을 다음 사용하고

. 이 시점에서 나는 다음 방법 사용하고 있습니다 :

public class BaseMessage 
{ 
    public const string Type = @"Messages.BaseMessage"; 
} 

public class LoginMessage : BaseMessage 
{ 
    public new const string Type = @"Messages.Client.LoginMessage"; 

    public string Nickname { get; set; } 
    public string Password { get; set; } 
} 

결론을

나는 최상의 경우이 같은 매니저를 수정하는 것입니다 생각 : GetTypeswitch를 사용

class Manager 
{ 
    // create event table 

    public Action<BaseMessage> this[string eventName] 
    { 
     get 
     { 
      if (!m_eventTable.ContainsKey(eventName)) 
      { 
       m_eventTable.Add(eventName, new Action<BaseMessage>(message => { })); 
      } 
      return m_eventTable[eventName]; 
     } 
     set 
     { 
      m_eventTable[eventName] = value; 
     } 
    } 

    public void Send(BaseMessage message, string messageName) 
    { 
     if (m_eventTable.ContainsKey(messageName) && this[messageName].Method != null) 
     { 
      this[messageName].Invoke(message); 
     } 
    } 

    private Dictionary<string, Action<BaseMessage>> m_eventTable = new Dictionary<string, Action<BaseMessage>>(); 
} 
+1

왜 필요한가요? 'typeof (SomeClass)'는 훨씬 더 다목적입니다 ...? 예를 들어'typeof (SomeClass) .FullName' –

+0

상수의 값이'typeof (SomeClass) .FullName'과 다르다면, 왜 직접 값을 속성에 넣지 않습니까? – dtb

+0

속성은 반사 작업입니다. 필요한 것은'GetType(). FullName'을 반환하는 기본 클래스의 속성과 비슷할 수 있습니다. – fero

답변

0

잘못된 방법입니다 가장 많이 파생 된 클래스 만 검사하기 때문에 (확장 성 파괴) 다형성을 구현할 수 있습니다.

특정 경우에 Manager이 문제를 일으키는 경우 dynamic 키워드와 오버로드 된 메서드를 사용할 수 있습니다. 그러나 이것은 확장을 위해 공개되지 않았기 때문에 SOLID를 다시 위반할 것입니다.

이렇게 SOLID를 위반하는 대신 가상 메서드를 사용하여 유형별 작업을 수행하는 방법을 찾으십시오.