2013-07-16 44 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