#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()
решил проблему, поскольку я загружал сборки, уже загруженные приложением.