Просто создайте собственного предка Dictionary<TKey,TValue>
, чтобы ввести ограничение. Как это:
public class CustomControlDictionary<TKey, TValue> : Dictionary<TKey, TValue>
where TValue : UserControl, IEspecialOptions
{
// possible constructors and custom methods, properties, etc.
}
Тогда вы сможете использовать его в своем коде так, как хотите:
// 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 = ...;
В случае, если параметр типа T
из вашего примера предоставлен извне, вы, естественно, должны ввести ограничение типа на уровне окружающего класса.
public class MyCustomControlContainer<T> where T : UserControl, IEspecialOptions
{
// this compiles:
private CustomControlDictionary<int, T>;
}
Примечание. Если вы хотите смешать экземпляры MyClass1
и MyClass2
в одном и том же словаре, вам необходимо ввести общего предка для них, наследуя от UserControl
и реализуя IEspecialOptions
. В этом случае правильный путь будет правильным.