Возможно ли иметь список несвязанных дженериков?

#c#

#c#

Вопрос:

Удивительно, но я не вижу, чтобы этот вопрос уже был указан в stack overflow.

У меня есть интерфейс, определенный как таковой:

IDatabaseRepository<in T> where T : DatabaseConfigBase

У меня есть несколько реализаций, таких как:

MongoDatabaseRepository<in MongoDatabaseConfig>

MySqlDatabseRepository<in MySqlDatabaseConfig>

У меня также есть фабрика, которая возвращает мне требуемый репозиторий, поэтому я могу проверить правильность базы данных в соответствии с конфигурацией во время выполнения:

 class RepositoryFactory 
{
    public RepositoryFactory(IEnumerable<IDatabaseRepository> dbImplementations)

    public IEnumerable<IDatabaseRepository<>> Create(string dbName)
}
 

Этот последний класс недопустим, потому что я не могу принять IEnumerable только для IDatabaseRepository. Компилятор требует, чтобы я указал IDatabaseRepository<T> , но я не знаю, каким будет T ? Мне нужен список всех моих реализаций, независимо от их T!

Есть ли какое-либо решение, кроме упаковки и распаковки всего в и из (объекта)?

Комментарии:

1. Обычное действие состоит в том, чтобы создать нестандартный интерфейс в вашей иерархии, например , IDatabaseRepository<T> : IDatabaseRepository , а затем сделать его своим элементом списка. Это несовершенно, но дает вам больше ограничений, чем просто использование object.

2. @AnthonyPegram Однако, это довольно часто запах кода, особенно если это пустые интерфейсы (часто называемые интерфейсами маркеров), и я бы предположил, что в этом случае они вонючие.

3. @DavidG Это не обязательно должны быть пустые интерфейсы. Вы можете заставить неродовой интерфейс предоставлять сигнатуры методов, используя object type вместо параметра generic type .

4. Даже если бы у вас был список IDatabaseRepository<> , как бы вы его использовали? Боюсь, мы недостаточно знаем о вашей проблемной области, чтобы предложить лучшую альтернативу.

5. @DavidG — Знаешь что, я думаю, ты прав. Я пытаюсь выполнить это кодирование за слишком маленькие временные блоки, между слишком многими встречами, мне нужно остановиться и переосмыслить эту архитектуру. Спасибо.