ОК ...
У меня есть следующие интерфейсы:
IJobWrapper(Of T As IJob)
IJob
Иследующие рефераты:
JobWrapper(Of T as IJob)
(агрегаты IJobWrapper(Of T)
) Job1
(агрегаты IJob
) Job2
(агрегаты IJob
)
Итак ... Сначала я нахожу реферат обёртки, используя:
Dim JobWrappers = AppDomain.
CurrentDomain.
GetAssemblies().
ToList().
SelectMany(Function(s) s.GetTypes()).
Where(Function(x) x.FullName.Contains("JobWrapper") And Not X.IsInterface).
First
Это работает нормально (я знаю, что это немного неэффективно, но я могу привести в порядок это)когда у меня есть рабочая версия).
Затем я использую отражение, чтобы получить все типы, которые реализуют IJob
(Как и выше, я не буду публиковать код, если он вам не нужен) И делаю ...
For Each JobType In JobTypes
Dim TypeArgs As Type() = {JobType.GetType}
Dim WrappedJob = JobWrapperType.MakeGenericType(TypeArgs)
''Do some other stuff
Next
Это исключение.В частности, этот вызов:
JobWrapperType.MakeGenericType(TypeArgs)
Результат: GenericArguments[0], 'System.RuntimeType', on 'MyProject.Jobs.JobWrapper'1[T]' violates the constraint of type 'T'.
Теперь в этом случае Job1
реализует IJob
.JobWrapper
ожидает IJob
в качестве параметра типа.
Может кто-нибудь подсказать, пожалуйста, как я могу получить ссылку на типы:
JobWrapper(Job1)
и JobWrapper(Job2)
Спасибо
В качестве небольшого фона: я загружаю сборки в новый домен приложений, а затем загружаю все IJobs
из сборок, загруженных в этот домен - следовательно, приходится использовать отражение.Упомянутые интерфейсы определены в общей сборке, на которую ссылаются как текущий проект, так и те, которые содержат фактические реализации Job