C# 反射:使用typeof()或IsAssignableFrom()检查类实现的接口时的不同行为
我有两个接口C# 反射:使用typeof()或IsAssignableFrom()检查类实现的接口时的不同行为,c#,.net,typeof,reflection,C#,.net,Typeof,Reflection,我有两个接口IConfigurationManager和ILocator定义在同一个程序集(我们称之为程序集“A”)和同一个命名空间中 有一个名为“B”的启动项目,其中“项目参考”是指组件“a” 程序集A也包含这两个接口的具体实现。我在程序集a上有一个“生成后事件”,它将DLL复制到“B”项目的“bin\debug”文件夹,当我从visual studio 2012运行应用程序时,应用程序将从该文件夹运行 在app.config文件中,我提到了在需要两个接口的具体实现时要使用的程序集和类型。(我
IConfigurationManager
和ILocator
定义在同一个程序集(我们称之为程序集“A”)和同一个命名空间中
有一个名为“B”的启动项目,其中“项目参考”是指组件“a”
程序集A也包含这两个接口的具体实现。我在程序集a上有一个“生成后事件”,它将DLL复制到“B”项目的“bin\debug”文件夹,当我从visual studio 2012运行应用程序时,应用程序将从该文件夹运行
在app.config文件中,我提到了在需要两个接口的具体实现时要使用的程序集和类型。(我需要在运行时解析类型映射,并且在不同的程序集中有接口和实现,而我根本没有开发这些接口和实现。)
在我的代码中,我从启动项目的“bin\debug\”文件夹中加载程序集A(使用assembly.LoadFile()
)。然后我迭代所有类型,并使用以下代码检查类是否为ILocator
类型:
if(type.GetInterfaces.Contains(typeof(IConfigurationManager))
这将返回FALSE,但另一方面,ILocator的类似代码将返回TRUE为什么会发生这种情况?我也尝试使用isassignablefrom()
,但得到了相同的结果
为什么在检查类实现的接口时,当所有其他内容(如声明接口的程序集、加载类型的程序集等)都相同时,一个调用成功而另一个调用失败?
注意:我知道Unity容器等,但我仍然有相同的问题与使用反射进行类型检查有关。可能是因为“其他所有内容”都不相同。因为您的B项目有一个对a的项目引用,所以它最终会加载a两次:首先是通过CLR加载a,当B使用a的类型ILocator
时,然后当您使用LoadFile
显式加载a时。由于LoadFile
将程序集加载到不同的域中,因此在应用程序域中会得到两个副本,其中两组类型(令人困惑地)具有相同的FullName
等,但它们是相同的。您可以通过比较IConfigurationManager
中的Assembly
对象,从type.GetInterfaces()
(或type
)和typeof(IConfigurationManager)
检查这一点,可能是因为“其他一切”都不一样。因为您的B项目有一个对a的项目引用,所以它最终会加载a两次:首先是通过CLR加载a,当B使用a的类型ILocator
时,然后当您使用LoadFile
显式加载a时。由于LoadFile
将程序集加载到不同的域中,因此在应用程序域中会得到两个副本,其中两组类型(令人困惑地)具有相同的FullName
等,但它们是相同的。您可以通过比较type.GetInterfaces()
(或type
)和typeof(IConfigurationManager)
什么是typeof().GetInterfaces()输出?@zabulus:当我附加一个调试器时,在GetInterfaces()返回的列表中,我可以清楚地看到IConfigurationManager
接口。但是,if(type.GetInterfaces.Contains(typeof(IConfigurationManager))
返回false!。但是奇怪的是,ILocator
!什么是typeof().GetInterfaces()输出?@zabulus:当我附加一个调试器时,我可以清楚地看到GetInterfaces()返回的列表中的IConfigurationManager
接口但是,if(type.GetInterfaces.Contains(typeof(IConfigurationManager))
返回false!。但奇怪的是,ILocator的情况并非如此!谢谢..许多人赞成说“其他一切都不一样”!我用了Assembly.Load
而不是LoadFile
解决了这个问题。谢谢..很多人投票说“其他一切都不一样”!我用了Assembly.Load
而不是LoadFile
,解决了这个问题。