基本 Message クラスと、処理可能なメッセージの各タイプを表す Message の約 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 のメッセージ サブタイプすべてと、基本メッセージ タイプも含まれるようになったという点で機能しているように見えます。ただし、プログラムの最初にリフレクションを使用して型を読み込むことは問題ありませんが、リフレクションを使用して適切なオブジェクトにリアルタイムでアクセスするには遅すぎる可能性があります。ということで、デリゲートを使ってみたいと思います。
@Mark Hildreth からの以下のコメントの例:
「それで、> の辞書ができます。次に、マッピングは mappings[MessageType.ChatMsg] = x => new MsgChat(x); になります。」
このコードを解釈するには、いくつかの方法があります。1 つのアイデアは、100 個のサブクラスをすべて削除し、100 個のデリゲート メソッドを含む 1 つの大規模なクラスのみを使用することです。それは遠い第二の選択です。もう 1 つのアイデアと私の最初の選択は、上記のコードでメッセージ サブクラス オブジェクトを作成することです。しかし、私はそれがどのようにこれを行うのかよくわかりません。また、100 個すべてを記述する必要なく、すべての型またはデリゲートを取得する上記の手法を Test クラスに保持するとよいでしょう。あなたまたは他の誰かがこれを行う方法を説明できますか?