将早期绑定对象类型转换为后期绑定对象类型

时间:2010-07-05 11:06:38

标签: vb.net reflection assemblies casting

我在项目(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(非常确定它不是类型安全检查?)方法,因为如果在“MyPrjoect”中引用了Utils.MyLateBoundType,我可以执行:

myLateBoundObject = DirectCast(myObject, Utils.MyLateBoundType)

没有任何问题 - 但这不是一个动态的解决方案。

有什么建议吗?

干杯,

1 个答案:

答案 0 :(得分:0)

是的,那不会像那样工作。您在代码中转换为动态加载类型的任何尝试都将使您的程序对程序集具有非动态依赖性。

您应该使用接口类型。使用您希望在主程序中可用的所有属性和方法,在单独的程序集中声明该类型。您的主程序和插件都将依赖它。动态类型应该继承它以提供实现。您现在可以将CreateInstance的返回值强制转换为该接口类型。