【问题标题】:Casting Early bound object type into Late bound object type将早期绑定对象类型转换为晚期绑定对象类型
【发布时间】:2010-07-05 11:06:37
【问题描述】:

我在一个项目 (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)

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

有什么建议吗?

干杯,

嗯。

【问题讨论】:

    标签: vb.net reflection assemblies casting


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这似乎是一种更潮的方式。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2016-01-01
    • 2014-08-31
    • 2011-07-17
    相关资源
    最近更新 更多