Как искать сборки для типов, которые реализуют желаемый универсальный интерфейс

#c# #reflection #interface #immediate-window

#c# #отражение #интерфейс #немедленное окно

Вопрос:

Я просматриваю сборки, чтобы определить любые классы, которые реализуют желаемый универсальный интерфейс, чтобы я мог динамически создавать экземпляр экземпляра. Это код, который я использую:

 var types = assembly.GetTypes();
var assemblyFormatters = types.Where(type => type.GetInterfaces().Any(i => 
   i.IsGenericType amp;amp; i.GetGenericTypeDefinition() == typeof(IInterface<>)));
 

Код работает для стандартного класса:

 public class Implementation : IInterface<object>
 

но не для универсального класса:

 public class GenericImplementation<T> : IInterface<T>
 

Странный случай, код успешно работает при запуске в промежуточном окне, но не при запуске в рамках модульного тестирования. Немедленное окно возвращает 2 типа, тестовый код, выполняемый в отладчике, возвращает только не общую реализацию.

Я бы ожидал, что оба типа будут возвращены кодом

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

1. Если код работает, значит, он работает. Я думаю, проблема в проекте модульного тестирования. Есть ли у этого проекта правильные ссылки?

2. Я так и думал. Оказывается, я загружал сборки из Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) , которые давали одну и ту же сборку, но из-за того, как они были загружены, сборки были разными. Я перешел к использованию AppDomain.CurrentDomain.GetAssemblies() , которое решило проблему. Я добавлю его в качестве ответа ниже

Ответ №1:

Оказывается, это проблема со сборками. Я загружал сборки с помощью:

 var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (var assembly in Directory.GetFiles(path, "*.dll"))
{
    Assembly.LoadFile(assembly);
}
 

При сравнении загруженной сборки со сборкой.GetExecutingAssembly(), сборки не равны. Поскольку типы имеют ссылки на свои соответствующие сборки, следовательно, типы не были равны. Переход к использованию AppDomain.CurrentDomain.GetAssemblies() решил проблему, поскольку я загружал сборки, уже загруженные приложением.