在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