首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >IsAssignableFrom()在应该返回true时返回false

IsAssignableFrom()在应该返回true时返回false
EN

Stack Overflow用户
提问于 2008-12-06 06:39:11
回答 4查看 12.7K关注 0票数 22

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

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

代码语言:javascript
复制
foreach(Type t in myTypes )
{
    if( typeof(IPlugin).IsAssignableFrom(t) )
    {
       ...
    }
}

由于某些原因,IsAssignableFrom()在应该返回true的时候却一直返回false。我曾尝试通过显式地给t一个应该传递的类型来替换它,它工作得很好,但由于某些原因,它不能处理从加载的程序集返回的类型。让事情变得更奇怪的是,代码在我同事的机器上运行得很好,但在我的机器上就不行了。

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

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-05 23:05:56

这通常发生在包含当前程序集引用的类型IPlugin的程序集与包含您正在迭代的类型的程序集所引用的程序集之间不匹配时。

我建议你打印出来:

代码语言:javascript
复制
typeof (IPlugin).Module.FullyQualifiedName

代码语言:javascript
复制
foreach (var type in t.GetInterfaces ()) 
{    
    Console.WriteLine (type.Module.FullyQualifiedName)
}

看看哪里不匹配。

票数 34
EN

Stack Overflow用户

发布于 2012-09-14 23:13:00

有时这是动态程序集引用另一个程序集的问题。

一件简单的事情就是禁用程序集上的本地复制(在visual studio中,右击引用并将copy local设置为false)。这样可以更容易地确定程序集所在的目录。

如果.NET不知道如何初始化类型,你也可以实现一个程序集解析器。

代码语言:javascript
复制
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler([Resolve Function]);
票数 1
EN

Stack Overflow用户

发布于 2008-12-05 22:53:28

我在Java中工作,它有相同的API方法,当我读代码的时候,我就是摸不着头脑(因为某些原因);因此,我总是相反地读它,在你的例子中,"t可赋值给IPlugin“。所以,如果C#有像乔纳森建议的那样" is”,我总是会使用它--当在Java中反映"instanceof“对类对象不起作用,只对对象的实例起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/345413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档