Отражение и обобщение в .Net - PullRequest
       22

Отражение и обобщение в .Net

1 голос
/ 21 февраля 2011

ОК ...

У меня есть следующие интерфейсы:

  • 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

1 Ответ

3 голосов
/ 21 февраля 2011

У вас слишком много GetType с - я думаю, вам просто нужно:

For Each JobType In JobTypes
    Dim TypeArgs As Type() = {JobType}
    Dim WrappedJob = JobWrapperType.MakeGenericType(TypeArgs)
    ''Do some other stuff
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...