С одной стороны, доступ к Banana.Suppliers
вводит в заблуждение. Это всегда даст тот же результат, что и при доступе к Apple.Suppliers
и т. Д. - у вас есть одна коллекция поставщиков.
Обычно каждый раз, когда вы обращаетесь к Banana.Suppliers
, компилятор отправляет вызов Fruit.Suppliers
: поэтому простой вызов Banana.Suppliers
не вызывает статический конструктор, который добавляет поставщика бананов.
Причина, по которой вы видите поставщиков, добавленных в статический конструктор для бананов после того, как вы создали банан, заключается в том, что он заставляет статический конструктор работать. Вы можете сделать что-нибудь еще, что заставит статический инициализатор работать, и вы получите те же результаты. Одним из примеров будет вызов статического метода внутри самого Banana
.
Теперь я сильно подозреваю, что у вас есть серьезная проблема в том, что вы будете использовать одинаковых поставщиков для всех типов. Очевидно, это не ваш настоящий код, и наилучшее решение будет зависеть от того, что вы хотите, чтобы ваш настоящий код делал. Generics может эффективно дать вам статические переменные «по типу», используя аргументы типа: Foo<Banana>.StaticProperty
и Foo<Apple>.StaticProperty
действительно будут разными, предполагая, что StaticProperty
объявлен в Foo<T>
.
РЕДАКТИРОВАТЬ: Что касается вашего редактирования, я бы посоветовал избегать использования статики здесь. Возможно создать фабрику для каждого типа (реализуя интерфейс, который может быть универсальным). Обратите внимание, что вы вполне можете избежать создания отдельной фабрики type для каждого подтипа, если сможете создать соответствующий экземпляр со всеми соответствующими элементами для каждого типа.
Нам действительно нужно увидеть больше примеров, чтобы сказать наверняка, но в целом я считаю, что чем меньше у вас статических данных, тем более тестируемым будет ваш дизайн и тем меньше вы столкнетесь с такими проблемами :)