2013-07-16 40 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); 
} 

在參數l本T ist必須與呼叫中提供的類型相匹配。

編輯:已經重新讀取的問題..也許這其實是你的意思:

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

正常開展活動受到嚴重關於逆變代表破碎的,它不包括方法,使事件發佈者可以向訂閱用戶是否仍然有興趣,並且不包括保證線程安全是指將訂戶發現,雖然在一個線程中運行,它不再需要它訂閱另一個事件,可以通知的發佈者。所有這些事情都可以通過觀察者模式的客戶實現來解決。 – supercat