当前位置:  开发笔记 > 编程语言 > 正文

IsAssignableFrom()在返回true时返回false

如何解决《IsAssignableFrom()在返回true时返回false》经验,为你挑选了3个好方法。

我正在开发一个插件系统,它可以加载包含在指定文件夹中的.dll.然后我使用反射来加载程序集,遍历它们包含的类型并识别实现我的IPlugin接口的任何类型.

我正在使用类似于以下内容的代码进行检查:

foreach(Type t in myTypes )
{
    if( typeof(IPlugin).IsAssignableFrom(t) )
    {
       ...
    }
}

出于某种原因,IsAssignableFrom()在返回true时保持返回false.我已经尝试t通过明确地给它一个应该传递的类型替换它,并且它工作正常,但由于某种原因它不能使用从加载的程序集返回的类型.为了使事情变得陌生,代码在我的同事的机器上工作正常,但在我的机器上却没有.

有谁知道任何可能导致这种行为的事情?

谢谢



1> Jb Evain..:

当包含当前程序集引用的类型IPlugin的程序集与包含您正在迭代的类型的程序集引用的程序集不匹配时,通常会发生这种情况.

我建议你打印:

typeof (IPlugin).Module.FullyQualifiedName

foreach (var type in t.GetInterfaces ()) 
{    
    Console.WriteLine (type.Module.FullyQualifiedName)
}

要查看不匹配的位置.



2> elm..:

当接口在单独的程序集中定义为实现类型时,我遇到了同样的问题.从根文件夹中迭代和加载程序集,其中包含带有类和带接口的dll的dll导致类型不匹配,如上所述.

一种解决方案是改为LoadFrom().LoadFile()LoadFrom方法有一些缺点,其中之一是:

如果已加载具有相同标识的程序集,则即使指定了不同的路径,LoadFrom也会返回已加载的程序集.

解决此问题的另一种方法是将具有实现接口的类型的所有dll放入单独的文件夹中,而不是复制引用的assembly(CopyLocal = False),因此Assembly.LoadFrom不会在内存中加载包含接口的dll.



3> kad81..:

其他一些答案提到IsAssignableFrom方法名称缺乏明确性.我同意,因此以错误的方式使用它.

尝试在代码中反转对象,然后查看它是否有效.例如:

更换:

if (typeof(IPlugin).IsAssignableFrom(t))

有:

if (t.IsAssignableFrom(typeof(IPlugin)))

通过这样做,我不仅让它工作,而且开始了解这种方法实际上做了什么.


实际上,这听起来不正确。根据文档(https://msdn.microsoft.com/pl-pl/library/system.type.isassignablefrom(v=vs.110).aspx),如果当前实例是c实现的接口,则返回true *。这使得`i.IsAssignableFrom(t)`在这种情况下有效。
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有