우리는 클래스가 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; }
}
결론을
나는 최상의 경우이 같은 매니저를 수정하는 것입니다 생각 : GetType
와 switch
를 사용
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>>();
}
왜 필요한가요? 'typeof (SomeClass)'는 훨씬 더 다목적입니다 ...? 예를 들어'typeof (SomeClass) .FullName' –
상수의 값이'typeof (SomeClass) .FullName'과 다르다면, 왜 직접 값을 속성에 넣지 않습니까? – dtb
속성은 반사 작업입니다. 필요한 것은'GetType(). FullName'을 반환하는 기본 클래스의 속성과 비슷할 수 있습니다. – fero