MessageHandlerCacheAttribute
というわけで、一番簡単そうな呼び出しの高速化をはかるため、メッセージハンドラの検索をキャッシュするアトリビュートを作成してみます。
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Struct, Inherited = false, AllowMultiple = false)] public class MessageHandlerCacheAttribute : Attribute { public MessageHandlerCacheAttribute() { } ///メッセージ ID をキーにもつメソッドの一覧 private Hashtable handlers = null; ///ハンドラ public MethodInfo this[int msgId] { get { System.Diagnostics.Debug(handlers != null, "InitializeHandler が呼び出されていません。"); return (MethodInfo) handlers[msgId]; } } ///メッセージハンドラの一覧を作成します /// 対象となるハンドラ一覧 private void InitializeHandlers(Type t) { ...; } }
骨組みとしてはこんなところでしょうか、MessageHandlerAttribute とは異なり、AllowMultipleやInheritedを false としなければなりません。
InitializeHandlers は自身が付与されたクラスにたいして呼び出されなければならないので、そういった情報を使いたいところなのですが前述の通りなので引数で持ちます。