美好的一天,Unity3D EventManager:帶有來自接口的泛型類型事件的字典
目前,我正在開發Unity事件的EventSystem。 因此,我想利用UnityEvent(在過去的一年中,我聽到了這個改進)。
EventManager應儘可能通用,因此通過它們的EventType註冊事件。因此我創建了一個派生自UnityEvent的通用BaseEvent。類型應該是IEventData,它是用於定義EventData對象的接口。
public class BaseEvent<T> : UnityEvent<T> where T : IEventData {}
public interface IEventData {}
public struct SomeEventData : IEventData
{
public readonly float someFloat;
public readonly bool someBool;
public SomeEventData(float param1, bool param2)
{
someFloat = param1;
someBool = param2;
}
}
現在我在Eventmanager中遇到了以下問題。 由於EventManager使用BaseEvent保存字典,因此在嘗試從像AddListener這樣的通用方法訪問它們時出現錯誤。
public class EventManager {
private Dictionary<System.Type, BaseEvent<IEventData>> m_events;
private static EventManager m_instance;
public static EventManager Instance {
get {
if (m_instance == null) {
m_instance = new EventManager();
}
return m_instance;
}
}
public static void AddListener<T>(BaseEvent<T> listener) where T : IEventData {
BaseEvent<T> tempEvent;
if (Instance.m_events.TryGetValue(typeof(T), out tempEvent)) {
tempEvent.AddListener(listener);
}
else {
tempEvent = new BaseEvent<T>();
tempEvent.AddListener(listener);
Instance.m_events.Add(typeof(T), tempEvent);
}
}
錯誤很明顯。無法將T的BaseEvent轉換爲IEventData的BaseEvent。但我不知道我需要更改代碼才能正常工作。我認爲「T:IEventData在哪裏」解決了這個問題,但我認爲它沒有,因爲T可能是派生類。
我的問題是: 是否可以添加泛型BaseEvents,因爲我打算這麼做?
非常感謝提前!
參見[這個問題和答案】(http://stackoverflow.com/questions/31572956/understanding-generics-and-func-arguments) – Draco18s