Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射:使用typeof()或IsAssignableFrom()检查类实现的接口时的不同行为_C#_.net_Typeof_Reflection - Fatal编程技术网

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
,解决了这个问题。