我創建一個通用的接口命令模式工作:C#泛型接口上
public interface IGenericComponent<T> where T : IVisitableObject
{
void Update(T msg);
}
然後,我將有另一個類,我會抱着一堆此接口的實現(各一與它自己的類型)。有有我的字典把命令列表來執行這樣的:
private Dictionary<MessageType, List<IGenericComponent>> _components;
這會產生一個編譯錯誤,因爲我不把對IGenericComponent類型。我有一個調用Update方法和認購(以字典INSERTA的成分)的方法的線程:
public void Subscribe<T>(MessageType messageType, IGenericComponent<T> component) where T : IVisitableObject, new()
{
lock (_monitorDictionary)
{
List<IGenericComponent> subscribedList;
if (_components.TryGetValue(messageType, out subscribedList))
{
subscribedList.Add(component);
IVisitableObject firstUpdate;
if(_messageBuffer.TryGetValue(messageType, out firstUpdate))
component.Update((T)firstUpdate);
}
else
{
subscribedList = new List<IGenericComponent>();
subscribedList.Add(component);
_components[messageType] = subscribedList;
}
}
}
private void ProcessQueue()
{
while (true)
{
IVisitableObject msg;
lock (_monitorQueue)
{
msg = _queue.Dequeue();
}
List<IGenericComponent> components;
lock(_monitorDictionary)
{
components = _components[msg.MsgType];
}
if(components!= null)
{
foreach (IGenericComponent genericComponent in components)
genericComponent.Update(msg);
}
}
}
此代碼不能編譯... 我從Java編程來,在Java中,我可以當我實例化類型時,省略參數化類型。所以...我想知道是否有可能在C#中做到這一點,所以它會假設它是泛型類型(IVisitableObject)。或者,如果你知道解決這個問題的更好方法... 我解決這個問題的方式並不是我想要的方式。我從界面中刪除了泛型,並使用泛型類型IVisitableObject作爲Update方法的參數。 在此先感謝。
Java的泛型與.NET完全不同。在Java中,泛型只是一些元數據和一些編譯器糖,以便在編譯時檢查類型安全性,並在必要時發出類型轉換(「擦除」)。但是,在.NET中,每個泛型類型在運行時都是作爲自己的類型構建的;他們就好像你已經寫了特定類型的代碼一樣,這就是爲什麼他們也爲值類型和原語工作的原因(例如'字典'等不包含鍵或值)。 –
Lucero
2012-01-10 18:41:15