У меня есть набор сообщений, которые все вытекают из Послания, и реализовать интерфейс IMessage:Интерфейс/Наследование/Делегат проблема разработки
class Message : IMessage
{
public string example1;
}
class LogOnMessage : Message
{
public string password;
}
class LogOffMessage : Message
{
public string anotherExample;
}
У меня есть система обмена сообщениями, в котором прокси-сервер способен обнаруживать входящие сообщения, и в зависимости от типа сообщения, запускает делегат формы
void MyDelegate(IMessage msg)
Это делается путем вызова регистрации обработчика функции, как это:
RegisterHandler(typeof(LogoffMessage),handler)
Реализация для этого просто словарь типов, с каждой записью будучи список обработчиков: Словарь < типа, список < MyDelegate>>
Теперь, это все хорошо, но, конечно же, обработчик выглядит например:
void MyHandler(IMessage msg)
{
LogOffMessage lMsg = (LogOffMessage)msg;
string athrEx = lMsg.anotherExample;
//Proceed with handling the logoff
}
Теперь есть пара проблем с этим. Во-первых, вы можете попытаться преобразовать Msg в неправильный тип.
Другая в том, что это немного безвкусный, чтобы разворачивать все в первые несколько строк обработчиком, вместо того, обработчики, как это, , которые я хотел бы иметь:
void MyDelegate(LogOffMessage msg)
Какие предложения вы бы сделали?
Я думал, может быть, вместо словаря типов, какая-то другая структура может использоваться для хранения разных типов делегатов с использованием дженериков. Таким образом, для каждого типа будет список MyDelegate < MsgType>. Но не ясно, как создать коллекцию коллекций, где каждый тип внутренней коллекции отличается.