我有一个实现通用接口的对象数组,例如
public class BaseEvent {}
public interface iResponder<in T> where T: BaseEvent
{
void respondToEvent(T event)
}
还有一些实现,例如
public class UpEvent : BaseEvent {}
public class DownEvent : BaseEvent {}
public class UpResponder : iResponder<UpEvent> {}
{
respondToEvent(UpEvent event) {}
}
public class DownResponder: iResponder<DownEvent> {}
{
respondToEvent(DownEvent event) {}
}
如果我创建一个对象数组,这些对象以不同的方式实现这些接口(所以一堆 UpResponders 和 DownResponders)。我还有一个向上或向下的事件列表,并在数组中运行。我可以使用
查询特定接口是否可用//pre-existing
List<BaseEvent> myEventsList;
List<object> myRespondersList;
foreach (BaseEvent nextEvent in myEventsList)
{
foreach (nextResponder in myRespondersList)
{
if (nextResponder is iResponder<UpEvent>)
{
iResponder<UpEvent> castResponder = nextResponder as iResponder<UpEvent>;
nextResponder.respondToEvent(nextEvent);
}
}
}
但是,我更喜欢获取 BaseEvent 的类型(例如 UpEvent)并确定对象是否实现了接口,而不必尝试每种已知类型。例如
//pre-existing
List<BaseEvent> myEventsList;
List<object> myRespondersList;
foreach (BaseEvent nextEvent in myEventsList)
{
// get the type here
System.Type eventType = nextEvent.GetType();
foreach (nextResponder in myRespondersList)
{
// eventType cannot be used to define the interface required
if (nextResponder is iResponder<eventType>) // - this will not work
{
iResponder<eventType> castResponder = nextResponder as iResponder<eventType>;
nextResponder.respondToEvent(nextEvent);
}
}
}
我已经找到了识别对象是否实现通用接口和其他技巧的方法,但我无法拼凑起来使这项工作发挥作用。
我曾尝试专门为每种侦听器类型创建列表(这将为我正在做的事情提供更好的性能)但这只是解决了问题 - 在某些时候我需要查看是否为某个对象实现了接口我只知道运行时的类型。
非常感谢任何帮助