C# 如何在泛型方法中传递继承的类型

C# 如何在泛型方法中传递继承的类型,c#,.net,generics,C#,.net,Generics,我有一个通用方法,它接受一个事件继承的类型(例如MouseMoveEvent),还有一个函数可以根据本地事件是否与作为TEvent传递的事件类型相匹配来执行 public bool Dispatch<TEvent>(TEvent e, Func<TEvent, bool> func) where TEvent : Event { if (_event.GetEventType() == e.GetEventType())

我有一个通用方法,它接受一个
事件
继承的类型(例如
MouseMoveEvent
),还有一个函数可以根据本地事件是否与作为
TEvent
传递的事件类型相匹配来执行

public bool Dispatch<TEvent>(TEvent e, Func<TEvent, bool> func) where TEvent : Event
        {
            if (_event.GetEventType() == e.GetEventType())
            {
                Event.Handled = func(e);
                return true;
            }

            return false;
        }
public bool Dispatch(TEvent e,Func Func),其中TEvent:Event
{
如果(_event.GetEventType()==e.GetEventType())
{
Event.Handled=func(e);
返回true;
}
返回false;
}
public void OnEvent(事件e)
{
EventDispatcher=新的EventDispatcher(e);
dispatcher.Dispatch(e,OnCloseWindow);
}
当我尝试调用该方法时,VS给出错误“无法从
MouseMoveEvent
转换为
Event
”。这对我来说很有意义,因为
TEvent
类型需要相同。我想我是在问是否有任何方法可以将
事件
传递给
MouseMoveEvent
继承
事件

谢谢

选项:

如果
t
特别是
MouseMoveEvent
并不重要:

  • dispatcher.Dispatch(e,OnCloseWindow)
  • dispatcher.Dispatch(e,OnCloseWindow)(隐式)
如果这很重要,而且
e
实际上是一个
MouseMoveEvent

  • dispatcher.Dispatch((mousemoveent)e,OnCloseWindow)(强制转换)
  • dispatcher.Dispatch((mousemoveent)e,OnCloseWindow)(隐式和强制转换)
如果这很重要,而您不知道,也许可以测试:

if(e是MouseMoveEvent mme)
{
//更具体地说,是mme
}
其他的
{
//不太具体,用e
}

通过将方法从

public bool Dispatch<TEvent>(TEvent e, Func<TEvent, bool> func) where TEvent : Event
        {
            if (_event.GetEventType() == e.GetEventType())
            {
                Event.Handled = func(e);
                return true;
            }

            return false;
        }
public bool Dispatch(TEvent e,Func Func),其中TEvent:Event
{
如果(_event.GetEventType()==e.GetEventType())
{
Event.Handled=func(e);
返回true;
}
返回false;
}

public bool Dispatch(事件e,Func Func),其中TEvent:Event
{
如果(e是TEvent&&Event.GetEventType()==e.GetEventType())
{
Event.Handled=func(e作为TEvent);
返回true;
}
返回false;
}

重要的是
e
MouseMoveEvent
。您的第三个选项是我认为有效的,但是当
e
不是
MouseMoveEvent
时,它会抛出一个
InvalidCastException
@BeckamWhite
is
操作符不会抛出任何异常,除非你做错了什么,否则我也试图避免像你的答案中那样的类型检查,以使代码更具可读性,但我想我必须牺牲这一点才能让它工作。@PavelAnikhouski是的,不过,我试图避免进行类型检查readability@BeckamWhite类型检查通常也可以通过多态性来避免——可能是基类型上的一些
virtualvoidfoo()
public bool Dispatch<TEvent>(TEvent e, Func<TEvent, bool> func) where TEvent : Event
        {
            if (_event.GetEventType() == e.GetEventType())
            {
                Event.Handled = func(e);
                return true;
            }

            return false;
        }
public bool Dispatch<TEvent>(Event e, Func<TEvent, bool> func) where TEvent : Event
        {
            if (e is TEvent && Event.GetEventType() == e.GetEventType())
            {
                Event.Handled = func(e as TEvent);
                return true;
            }

            return false;
        }