2013-07-03 149 views
1

我有一些麻煩,試圖總結我的周圍是如何通用參數預計頭在下面的代碼情況下工作:作爲泛型參數傳遞時,爲什麼泛型類型不被識別爲其派生類型?

class Predicate { } 
class BarPredicate : Predicate { } 
class FooPredicate : Predicate { } 

class Program { 

    private static IPredicateHandler<T> Create<T>(T t) where T : Predicate 
    { 
     // T is always Predicate 
    } 

    static void Main(string[] args) 
    { 
     var list = new List<Predicate>() {new FooPredicate(), new BarPredicate()}; 
     foreach (var item in list) 
     { 
      var o = Create(item); 
     } 
    } 
} 

當調用創建,泛型類型T總是被設置爲代替謂詞派生類型。我明白這是因爲列表中的對象被存儲爲Predicates。但是,我期望在調用Create時可以識別派生類型。爲什麼這不會發生在這裏?有什麼辦法可以讓派生類型(FooPredicate/BarPredicate)被傳遞到Create而不是基類型(Predicate)?

回答

4

使用動態類型執行重載解析的最簡單方法是使用dynamic關鍵字。

foreach (dynamic item in list) { 
    dynamic o = Create(item); 
} 
+0

有趣!它爲什麼這樣工作? – csano

+1

+1。它確實創造出正確的類型 - 謝謝! (比'MakeGenericType'代碼容易得多)。 –

+0

同意。這是一個漂亮的伎倆。試圖找出究竟如何(以及爲什麼)它的工作原理! – csano

2

這是因爲您有Predicates的列表。當你從列表中獲得元素時,它仍然只是一個基類。在運行時它將是一個派生類,但是在編譯期間通用作品。

+0

我知道,但它並沒有想到。感謝您的提醒! – csano

相關問題