2013-07-16 5 views
3

Я пытаюсь сделать что-то вдоль линийИспользование генериков для строго типизированных обработчиков событий?

class Receiver { 
    public RegisterEvent<T>(???); 
} 

class EventTypeClass { 
    ... 
} 

class MyApp 
{ 
    public MyApp() 
    { 
     RegisterEvent<EventTypeClass>(MyEventHandler); 
    } 

    void MyEventHandler(EventTypeClass param) 
    { 
     // Handle event of type 'EventTypeClass' 
    } 
} 

Я не знаю, как я могу передать сильно типизированных обработчик событий в качестве параметра или, если это вообще возможно, или я вынужден использовать что-то как

void MyEventHandler(object param) 
{ 
    var castedParam = param as EventTypeClass; 
} 

ответ

4

Вы можете просто передать общий тип аргументу .. как это:

class Receiver { 
    public RegisterEvent<T>(T param); 
} 

The T в аргументе л ist должен соответствовать типу, указанному в вызове.

EDIT: Перечитав вопрос .. возможно, это на самом деле то, что вы имели в виду:

public delegate void CustomEventHandler<T>(T param); 
public void RegisterEvent<T>(CustomEventHandler<T> eh) { 

} 

..same философию, хотя.

+0

Спасибо !! Это именно то, что я собирался (тот, что был в редактировании). Однако я забыл о неотъемлемой части всей сделки. В методе RegisterEvent я могу хранить обработчики событий в словаре или что-то еще? Учитывая, что существует потенциально бесконечное количество различных событий, которые запускает класс, мне нужно будет каким-то образом сохранить зарегистрированные обработчики/события. – Muhwu

0

Похоже, вам нужен метод RegisterEvent взять универсальный делегат:

delegate void EventHandlerDelegate<ClassType>(ClassType p); 
class Receiver 
{ 
    public RegisterEvent<T>(EventHandlerDelegate<T> callback); 
} 

Что также означает код вызова не требуется явно предоставить тип «закрыть» общий метод:

receiver.RegisterEvent(MyEventHandler); 

Это поднимает вопрос о том, почему вы не просто использовать событие, хотя ....

+0

Нормальная реализация событий сильно нарушена в отношении контравариантных делегатов, она не содержит средств, с помощью которых издатель событий может запросить подписку, является ли абонент по-прежнему интересным, и не включает в себя не гарантированные-потокобезопасные средства, с помощью которых подписчик, который обнаруживает, в то время как работает на одном потоке, что ему больше не требуется событие, подписанное на другое, может уведомить издателя об этом. Все эти вещи могут быть исправлены с использованием пользовательских реализаций шаблона Observer. – supercat

Смежные вопросы