【发布时间】:2013-12-18 13:35:22
【问题描述】:
在 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,那么这里有解决方案还是我应该尝试创建一个 MyMessage/MyMessageReceiver 类并扩展它们?我不太喜欢这样的声音,因为它增加了一些困难。
-
@Zeritor - 我在下面添加了一个答案。