我有一个基本的 Message 类,以及大约 100 个不同的 Message 子类型类,它们代表可以处理的每种类型的消息。我目前正在考虑做的是使用一个巨大的 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 个消息子类型,以及基本消息类型。然而,虽然我不介意在程序开始时使用反射来加载类型,但使用它来实时访问正确的对象可能太慢了。所以,我想尝试使用委托。
@Mark Hildreth 下面评论中的示例:
“所以,你会有一个 > 的字典。然后,你的映射将是 mappings[MessageType.ChatMsg] = x => new MsgChat(x);”
有几种方法可以解释此代码。一种想法是删除所有 100 个子类,只使用一个具有 100 个委托方法的大型类。这是一个遥远的第二选择。另一个想法和我的第一选择是让上面的代码以某种方式创建一个消息子类对象。但是,我不太明白它会如何做到这一点。此外,最好将上述技术保留在我的 Test 类中,以获取所有类型或委托,而不必编写全部 100 个。你或其他人能解释一下如何做到这一点吗?