2017-05-04 104 views
2

美好的一天,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,因爲我打算這麼做?

非常感謝提前!

回答

0

我複製你的代碼在Visual Studio和錯誤是:

Argument 2: can not covert from 'out BaseEvent<T>' to 'out BaseEvent<IEventData>' 

下一次你發佈你的問題

然而,在你的地方,我想請包括這種錯誤信息改變BaseEvent<T> tempEvent;的聲明BaseEvent<IEventData> tempEvent;而且應該讓你去

1

你所面臨的問題是協方差,這不是目前在統一提供的淨集的支持。

你的問題得到了很好的解釋here

+0

參見[這個問題和答案】(http://stackoverflow.com/questions/31572956/understanding-generics-and-func-arguments) – Draco18s