Приведение типа объекта с ранней привязкой в ​​тип объекта с поздней привязкой - PullRequest
0 голосов
/ 05 июля 2010

У меня есть фрагмент кода в проекте (MyProject), который содержит ранее связанный объект из сборки, на которую имеется ссылка (назовем ее CommonAssembly):

Dim myObject As CommonAssembly.MyEarlyBoundType

теперь у меня есть другая сборка, котораядинамически загружается, поскольку он присутствует не во всех проектах:

Dim myLateBoundObject As Object = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("Utils", "Utils.MyLateBoundType")

MyLateBoundType является производным от CommonAssembly.MyEarlyBoundType, и я хочу привести myObject к myLateBoundObject, а затем программно вызвать дополнительные методы-члены с помощью отражения.Я бы подумал, что при извлечении типа myLateBoundOject и приведении myObject в myLateBoundObject это будет работать, но методы CType () и DirectCast () не будут принимать извлеченный тип, ссылаясь на «Ключевое слово не называет тип»ошибка:

myLateBoundObject = DirectCast(myObject, GetType(myLateBoundObject))

Я не совсем уверен, почему динамически загружаемый тип не может быть использован против метода DirectCast (почти уверен, что он не проверен на безопасность типов?), поскольку, если на Utils.MyLateBoundType была ссылка в MyPrjoect", Я мог бы выполнить:

myLateBoundObject = DirectCast(myObject, Utils.MyLateBoundType)

без проблем - но это не динамическое решение.

Есть предложения?

Приветствия,

Ням.

1 Ответ

0 голосов
/ 05 июля 2010

Да, это не сработает. Любая попытка преобразования в динамически загруженный тип в коде приведет к тому, что ваша программа будет иметь нединамическую зависимость от сборки.

Вы должны использовать тип интерфейса. Объявите этот тип со всеми свойствами и методами, которые вы хотите иметь в своей основной программе, в отдельной сборке. И ваша основная программа, и ваш плагин будут зависеть от него. Динамический тип должен наследовать его, чтобы обеспечить реализацию. Теперь вы можете привести возвращаемое значение CreateInstance к этому типу интерфейса.

...