我有一個基類消息類和大約100個不同的消息子類,它們表示可以處理的每種消息類型。我目前正在考慮的是使用巨大的switch語句來創建消息對象。例如:處理創建大量子類型對象的最佳方法
switch (MsgType)
{
case MessageType.ChatMsg:
Msg = new MsgChat(Buf);
break;
case MessageType.ResultMsg:
Msg = new MsgResult(Buf);
break;
... // 98 more case statements
}
Msg.ProcessMsg(); // Use a polymorphic call to process the message.
有沒有更好的方法來做到這一點?如果是這樣,你可以展示一個簡單的代碼示例。
編輯
於是,我試着這樣做:
public class Test
{
public Test()
{
IEnumerable<Type> myEnumerable = GetTypesWith<MyAttribute>(true);
}
IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit)
where TAttribute : System.Attribute
{
return from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where t.IsDefined(typeof(TAttribute), inherit)
select t;
}
}
這似乎在myEnumerable工作現在包含消息亞型的所有100個,加上基本消息類型爲好。但是,雖然我並不介意在程序開始時使用反射來加載類型,但使用它來實時訪問適當的對象可能會太慢。所以,我想嘗試使用委託。
在下面從@馬克希爾德雷思註釋的例子:那麼,有
」你>然後,你的映射會映射[MessageType.ChatMsg] = X =>新MsgChat的字典( X);」
有幾種方法來解釋這段代碼。一個想法是刪除所有100個子類,並使用100個委託方法使用一個大型類。這是一個遙遠的第二選擇。另一個想法和我的第一選擇是讓上面的代碼以某種方式創建一個消息子類對象。但是,我不太明白它會如何做到這一點。另外,在我的Test類中保留上面的技巧並獲得所有類型或委託而不必寫出所有類型或委託,這將是非常好的。你或其他人可以解釋如何做到這一點嗎?
爲什麼你需要100個類時,類型屬性可能足夠類? – tschmit007
利用多態性並橫向擴展系統的智能。 –