Возможно, вам даже не понадобится словарь, чтобы это сделать, но это зависит от ваших потребностей. Если вам нужен только 1 такой список для каждого типа в домене приложения (т. Е. «Словарь» - static
), следующий шаблон может быть эффективным и хорошо продвигать вывод типов:
interface IBase {}
static class Container {
static class PerType<T> where T : IBase {
public static IEnumerable<T> list;
}
public static IEnumerable<T> Get<T>() where T : IBase
=> PerType<T>.list;
public static void Set<T>(IEnumerable<T> newlist) where T : IBase
=> PerType<T>.list = newlist;
public static IEnumerable<T> GetByExample<T>(T ignoredExample) where T : IBase
=> Get<T>();
}
Обратите внимание, что перед принятием этого подхода вы должны тщательно подумать о различии между типом времени компиляции и типом времени выполнения. Этот метод с радостью позволит вам хранить переменную IEnumerable<SomeType>
с типом времени выполнения как в SomeType
, так и в случае ее приведения к любому из базовых типов SomeType
, включая IBase
, без ошибок времени выполнения или типа компиляции - это может быть функция или ожидающая ошибка, поэтому вы можете захотеть if
проверить это.
Кроме того, этот подход игнорирует многопоточность; поэтому, если вы хотите получить доступ к этой структуре данных из нескольких потоков, вы, вероятно, захотите добавить некоторую блокировку. Справочные чтения / записи являются атомарными, поэтому вы не получите повреждения, если не сможете заблокировать, но устаревшие данные и условия гонки, безусловно, возможны.