Это продолжение этого вопроса . Только читайте, если вы заинтересованы в предыстории.
Короче говоря, я использую отражение для загрузки набора универсальных типов из сборки. Сборка загружается во время выполнения.
У меня есть вторая сборка, на которую ссылается и мой текущий проект, и сборка, которую я загружаю, которая содержит интерфейсы:
IJob
IJobWrapper(Of IJob)
Сборка, которую я загружаю (назовите ее Jobs.dll
), содержит JobWrapper(Of IJob)
- реализующий интерфейс IJobWrapper
.
Jobs.dll
также содержит несколько заданий, которые реализуют IJob
Теперь я загружаю соответствующие типы в контейнер (Unity) и вытаскиваю их по мере необходимости. Это работает (то есть контейнер разрешает ссылки соответствующим образом и создает объект)
Примечание: JobType
и JobWrapperType
ниже извлекаются с помощью отражения.
В частности:
Dim TypeArgs As Type() = {JobType}
Dim WrappedJob = JobWrapperType.MakeGenericType(TypeArgs)
Dim ContainerJob = Container.Resolve(WrappedJob)
Dim JobInstance = DirectCast(ContainerJob, IJobWrapper(Of IJob))
Здесь выдается ошибка - последняя строка с приведением.
ContainerJob
в строке 3 технически является объектом, так как мне нужно использовать перегрузку, не являющуюся универсальной, для разрешения (т. Е. Параметр Type не является '(Of XXX)').
Согласно отладчику, на самом деле это MyProject.Jobs.JobWrapper(Of MyProject.Jobs.DailyStatusReport)
MyProject.Jobs.JobWrapper
Инвентарь IJobWrapper(Of IJob)
MyProject.Jobs.DailyStatusReport
Инвентарь IJob
DirectCast выдает это исключение:
Unable to cast object of type 'MyProject.Jobs.JobWrapper`1[MyProject.Jobs.DailyStatusReport]' to type 'MyProject.JobService.Common.IJobWrapper`1[MyProject.JobService.Common.IJob]'.
Может кто-нибудь объяснить, почему он не может выполнять бросок / как его обойти? Мне интересно, если у него возникли проблемы с сопоставлением интерфейса, определенного в сборке, на которую ссылаются, изнутри Jobs.dll
- Но если это так, я не уверен, как их согласовать.
Большое спасибо.
РЕДАКТИРОВАТЬ:
Примеры методов из интерфейсов:
IJob:
Function ShouldExectute() As Boolean
Sub Execute()
IJobWrapper:
Function ShouldExectute() As Boolean
Sub Execute()
ReadOnly Property DatabaseId as Long
ReadOnly Property Name as String
ReadOnly Property IsDisabled As Boolean
Например, Job Wrapper никогда не возвращает ничего с типом IJob. Он использует информацию о типе для поиска различных атрибутов, которые были присоединены к классу, который реализует IJob, и считывает информацию.