只是讓Dictionary<TKey,TValue>
的自定義祖先引入約束。就像這樣:
public class CustomControlDictionary<TKey, TValue> : Dictionary<TKey, TValue>
where TValue : UserControl, IEspecialOptions
{
// possible constructors and custom methods, properties, etc.
}
然後你就可以在你的代碼中使用它像你想:如果從你的榜樣類型參數T
從外部提供
// this compiles:
CustomControlDictionary<int, MyClass1> dict1 = new CustomControlDictionary<int, MyClass1>();
CustomControlDictionary<int, MyClass2> dict2 = new CustomControlDictionary<int, MyClass2>();
// this fails to compile:
CustomControlDictionary<int, string> dict3 = ...;
,你必須這樣做,很自然地,在周圍的班級引入類型約束。
public class MyCustomControlContainer<T> where T : UserControl, IEspecialOptions
{
// this compiles:
private CustomControlDictionary<int, T>;
}
注:如果你想在同一字典都MyClass1
和MyClass2
情況下混合,你就必須引入一個共同的祖先對他們來說,從UserControl
繼承和實施IEspecialOptions
。在這種情況下,抽象類將是正確的方法。