まず、私の質問の背景について少し説明します。C# でモジュール式のサーバー/クライアント型プログラムを作成しています。クライアントキューからのパケットを処理するスレッド処理システムがあります。これは、私が取り組んでいるものの例です。
public delegate object ProcessPacket(object data);
public class QueueHandler
{
//Awesome functions/variables
private void Proccess()
{
object retPacket = client.ProcessPacket(obj);
NetworkCommon.Sendpacket(retPacket, _clientSocket);
}
//Even more awesome functions.
}
//Client ProcessPacket delegate
private static object ProcessPacket(object packet)
{
ReturnPacket ret = new ReturnPacket();
switch (packet.Command)
{
case Command.Login:
//Do login stuff
break;
case Command.Foo;
//Foo stuff
break;
case Command.Bar;
//Bar stuff
break;
default:
ret.Responce = CommandResponce.CommandNotRecognized;
}
return ret;
}
ご想像のとおり、これはあまり拡張性がなく、機能の追加を管理するのが難しくなります。私の質問は、これのより実用的な方法は何ですか?
List<string,TProcessCommand>
関数にカスタム属性を割り当ててから、起動時にリフレクションを使用してそのリストを作成するという、ある種のことを考えました。しかし、それでも管理が面倒で、起動するたびに不要な処理能力が必要になる可能性があると感じています.
私が検討した別のオプションはMEFを使用することですが、慣れていないLinqを使用せずにコマンドを識別する方法に頭を悩ませています。
[[編集]]MEF
例で
気づいたのですが、ExportMetadataAttribute
が使用されていました。私のコードでこれを試してみます。