使用泛型用于强类型事件处理程序?

时间:2013-07-16 10:51:21

标签: c# templates generics types parameters

我正在尝试按照

的方式实施某些内容
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;
}

2 个答案:

答案 0 :(得分:4)

你可以将泛型类型传递给参数..就像这样:

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

参数列表中的T必须与呼叫中提供的类型匹配。

编辑:重新阅读了这个问题......也许这就是你的意思:

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

}

..同样的哲学。

答案 1 :(得分:0)

看起来你需要RegisterEvent方法来获取泛型委托:

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

这也意味着您的调用代码无需显式提供“关闭”泛型方法的类型:

receiver.RegisterEvent( MyEventHandler );

它提出了一个问题,即你为什么不只是使用事件......