在IMyMessage.cs在接口中使用泛型时无法投射/匹配类型,为什么?
public interface IMyMessage
{
}
在IMyMessageReceiver.cs
public interface IMyMessageReceiver<T> where T: IMyMessage
{
void HandleMessage(T message);
void Subscribe();
}
在MyMessagePublisher.cs
public static class MyMessagePublisher
{
private static Dictionary<Type, List<IMyMessageReceiver<IMyMessage>>> _subscribers;
static MyMessagePublisher
{
_subscribers = new Dictionary<Type, List<IMyMessageReceiver<IMyMessage>>>();
}
public static function Subscribe<T>(IMyMessageReceiver<T> receiver) where T: IMyMessage
{
Type messageType = typeof (T);
List<IMyMessageReceiver<IMyMessage>> listeners;
if(!_subscribers.TryGetValue(messageType, out listeners))
{
// no list found, so create it
List<IMyMessageReceiver<T>> newListeners = new List<IMyMessageReceiver<T>>();
// ERROR HERE: Can't convert List<IMyMessageReceiver<T>> to List<IMyMessageReceiver<IMyMessage>>
_subscribers.add(messageType, newListeners);
}
// I would then find the right list and add the receiver it to it but haven't got this far
}
}
所以我希望是用一堆 'IMyMessages' 和“IMyMessageReceivers的'传递消息。我早些时候做了一个硬编码的方法,但厌倦了100个不同的发布/订阅函数名称,所以我想我会把它很好地包装到泛型中。
我的问题是,我不能让代码在使用泛型时工作。即使我指定类型T将是IMyMessage,我不能在任何需要IMyMessage的地方使用T.也许我只是习惯于基础/扩展类,因为它可以在那里很好地工作。我尝试过从铸造到真正通用的各种方法,但我总是遇到同样的问题。
你试图在协变的方式使用'T',但在C#的输入参数,只能进行逆变 – Sean
@Sean,是这里有一个解决方案那么还是应该尝试创建一个MyMessage/MyMessageReceiver类并扩展它们呢?我不太喜欢这种声音,因为它增加了一些困难。 – Zeritor
@Zeritor - 我在下面添加了一个答案。 – Sean