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
@BeckamWhiteis
操作符不会抛出任何异常,除非你做错了什么,否则我也试图避免像你的答案中那样的类型检查,以使代码更具可读性,但我想我必须牺牲这一点才能让它工作。@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;
}