【问题标题】:Reflection : Different behavior while using typeof() or IsAssignableFrom() to check interface implemented by a class反射:使用 typeof() 或 IsAssignableFrom() 检查类实现的接口时的不同行为
【发布时间】:2013-12-20 08:50:08
【问题描述】:

我在同一个程序集中定义了两个接口 IConfigurationManagerILocator(我们称之为程序集“A”)和同一个命名空间。

有一个名为“B”的启动项目,它具有对程序集“A”的“项目引用”。

Assembly A 也包含这两个接口的具体实现。我在程序集 A 上有一个“构建后事件”,当我从 Visual Studio 2012 运行应用程序时,它将 DLL 复制到“B”项目的“bin\debug”文件夹中。

在 app.config 文件中,我提到了当我想要两个接口的具体实现时使用哪个程序集和类型。 (我需要在运行时解析类型映射,并且将在不同的程序集中拥有接口和实现,而我很多人根本没有开发。)

在我的代码中,我从启动项目的“bin\debug\”文件夹中加载程序集 A(使用 Assembly.LoadFile())。然后我遍历所有类型并使用以下代码检查一个类是否属于ILocator 类型:

if(type.GetInterfaces.Contains(typeof(IConfigurationManager))

这会返回 FALSE,但另一方面,ILocator 的类似代码会返回 TRUE。 为什么会这样?我也尝试使用IsAsseignableFrom(),但得到了相同的结果。

在检查类实现的接口时,为什么一个调用成功而另一个调用失败?

注意:我知道 Unity 容器等。但我仍然有与使用反射进行类型检查有关的相同问题。

【问题讨论】:

  • 什么是 typeof().GetInterfaces() 输出?
  • @zabulus:当我附加一个调试器时,我可以在GetInterfaces()返回的列表中清楚地看到IConfigurationManager接口。但是,if(type.GetInterfaces.Contains(typeof(IConfigurationManager)) 返回错误! .. 但奇怪的是,ILocator 并非如此!

标签: c# .net typeof reflection


【解决方案1】:

可能是因为“其他一切”不一样。由于您的 B 项目有一个对 A 的项目引用,它最终会加载 A 两次:第一次是由 CLR,当 B 使用来自 A 的类型 ILocator 时,然后当您使用 LoadFile 显式加载 A 时。因为LoadFile 将程序集加载到不同的binding context 中,所以您在应用程序域中获得了两个A 副本,其中两组类型(令人困惑地)具有相同的FullName 等,但它们是nevertheless different。您可以通过比较来自type.GetInterfaces ()(或type)和typeof (IConfigurationManager) 中的IConfigurationManager 中的Assembly 对象来检查这一点。

【讨论】:

  • 谢谢.. 很多人赞成说“'其他一切'都不一样”!我用Assembly.Load 代替LoadFile 解决了这个问题。
猜你喜欢
  • 2023-03-03
  • 2010-12-03
  • 2021-09-26
  • 2015-10-21
  • 2011-10-31
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多