2010-12-23 161 views
0

我有一個方法要求輸入<T>。它只需要這個類型定義了一個Count屬性。我怎樣才能將它指定爲允許定義了所有對象的類型約束?C#中方法中泛型類型的約束條件#

這是我目前:

private static void writeData<T>(String fileName, T rawData) where T : ICollection 

然而,這不會,如果我嘗試用IDictionary使用它。我還能嘗試什麼?

更新:我認爲問題在於我將它限制在非通用ICollection而不是通用ICollection<E>

+0

定義「這不行」。這應該按原樣工作。 – 2010-12-23 18:12:28

+0

你的意思是與IDictionary ?由於IDictionary推理ICollection – Vadim 2010-12-23 18:14:16

回答

2

您的代碼應與IDictionary一起使用,因爲它實現了ICollection
請注意,它不會與IDictionary<TKey, TValue>一起使用,因爲它不實現(非通用)ICollection
如果你想接受泛型集合,你可以把它改成

static void WriteData<TElement>(String fileName, ICollection<TElement> rawData) 

順便說一句,你實際上並不需要在這裏使用仿製藥;你只需要一個類型爲ICollection的參數,調用者可以傳遞任何派生類型。
要採用泛型集合,您需要元素的類型參數,但不適用於集合類型。

要回答你的另一個問題,你不能通過存在一個屬性來限制一個參數,除非通過創建一個接口。
由於在框架中沒有ICountedEnumerable接口,所以你在那裏運氣不好。 (除非你製作你自己的界面,只允許實現它的自定義集合)

0

我不認爲你可以在編譯時做到這一點。

您可以使用反射來檢查T是否有Count方法,然後調用它。

0

迴應更新:然後不要傳遞字典。改爲傳遞dictionaryVariable.Values