gpt4 book ai didi

c# - 转换为基类抛出 InvalidCastException

转载 作者:行者123 更新时间:2023-11-30 17:13:10 26 4
gpt4 key购买 nike

我的一个程序集包含以下“提供者”类型:

InheritanceTree

我还有一个 XML 文件,它使用 DeviceInfoProvider 基类保存提供者信息。简化版本如下所示:

<DeviceInfoProvider Type="SbRioI2CProvider" Assembly="assembly.dll" >
</DeviceInfoProvider>
<DeviceInfoProvider Type="GenericProvider" Assembly="assembly.dll" >
</DeviceInfoProvider>

在运行时,我将 XML 字段映射到我的变量:

assembly.dll  ⇒ assemblyPath
Type ⇒ typeName

读取 XML 后,使用以下代码实例化我的类型:

var assembly = Assembly.LoadFrom(assemblyPath);

var type = (from t in assembly.GetTypes()
where t.IsPublic && t.Name == typeName
select t).FirstOrDefault();

if (type != null)
{
instance = type.GetConstructor(Type.EmptyTypes).Invoke(null);
}

正如预期的那样,这会适本地生成我的对象。

当我尝试将实例转换为基类对象时出现问题:

using (var provider = instance as DeviceInfoProvider)
{
// provider is null!
}

instance 的运行时类型是预期的派生类,但我无法将其成功转换为其基类型。

我错过了什么?

最佳答案

您的问题可能是您正在从 LoadFrom 上下文中的 assembly.dll 中的类型创建实例(GenericProvider、SbRioI2CProvider)。然后您尝试按名称转换为该程序集中的类型 (DeviceInfoProvider)。这隐含地使用了 Load 上下文。来自同一程序集但在不同上下文中加载的类型被运行时视为不同类型,因此转换失败并且您得到 null。 This文章对程序集绑定(bind)上下文提供了一些额外的解释。

要使此转换成功,您需要将在 LoadFrom 上下文中加载的 Assembly 获取到 Load 上下文中。有几种方法可以做到这一点。一种方法是将程序集放在 GAC 中。另一种是从应用程序库中删除 assembly.dll,这样它就不会被探测找到。然后使用 AppDomain.AssemblyResolve 事件加载您通过 LoadFrom 获得的 Assembly

关于c# - 转换为基类抛出 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com