Как искать сборки для типов, которые реализуют желаемый универсальный интерфейс - PullRequest
0 голосов
/ 16 апреля 2019

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

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

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

public class Implementation : IInterface<object>

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

public class GenericImplementation<T> : IInterface<T>
* 1009Событие незнакомец, код успешно работает при запуске в промежуточном окне, но не при запуске в рамках модульного тестирования.Непосредственное окно возвращает 2 типа, тестовый код, запущенный под отладчиком, возвращает только неуниверсальную реализацию.

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

1 Ответ

0 голосов
/ 16 апреля 2019

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

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

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

...