我已經閱讀了關於這個問題的幾篇文章,但沒有一個答案似乎適用於我。這裏的情況是 - 我有一個通用的功能,在其他類調用:如何將對象轉換爲自己的類型?
public class Dispatcher<T> where T : Event {
public void Notify<X>(X tEvent) where X : Event {
if (someField is IListener<X, T>) {
//this never executes--X is Event regardless of its derived type
}
}
}
和調用代碼:
public class Effect {
public Event myEvent;
public CallNotify() {
Dispatcher.Notify(myEvent);
}
}
的問題是,事件有幾十個派生類型的,我需要Notify()調用與派生類型X一起發生。到目前爲止,無論事件是否傳入,它都會調用Notify < Event>()。編譯的唯一解決方案是調用Notify(myEvent作爲DerivedEvent) ,但必須對每種類型進行硬編碼 - 不可接受。
如果我從派生類的實例中給它一個「this」指針,類似的函數會正確地推斷出它。
這裏肯定有一個使用反射的解決方案。
您不能使用接口嗎? – 2011-04-05 16:00:32
你能舉出更多的示例代碼嗎?我沒有看到OtherClass與Dispatcher的關係。編譯器會自動填充Notify方法的泛型參數爲Event,因爲myEvent是Event類型。你必須從別的地方調用它,它具有顯式類型的myEvent,用你想要的通用參數調用Notify方法 – BrandonAGr 2011-04-05 16:39:44
Dispatcher是OtherClass,對不起。我編輯了這個問題。你很簡潔地解決問題。爲了從其他地方調用Notify(),我可能需要爲每個派生類編寫一個函數。我使用這種方法來實現類似的功能:註冊(this)工作得很好,從實現IListener 的每個類調用。但是那個代碼......似乎更加必要,不像樣板/開銷。我會嘗試這種方法 –
MrEff
2011-04-05 17:37:20