C# IsAssignableFrom和GetInterface之间的区别是什么?

C# IsAssignableFrom和GetInterface之间的区别是什么?,c#,.net,reflection,C#,.net,Reflection,使用.Net中的反射,以下两者之间的区别是什么: if (foo.IsAssignableFrom(typeof(IBar))) 及 哪个更合适,为什么? 一个或另一个什么时候会失败?如果您只想查看某个类型是否实现了给定的接口,则两者都可以,尽管GetInterface()可能更快,因为IsAssignableFrom()比GetInterface()执行更多的内部检查。检查.GetInterfaces()类型的结果可能会更快,它返回的内部列表与其他两个方法使用的内部列表相同。编辑:这个

使用.Net中的反射,以下两者之间的区别是什么:

   if (foo.IsAssignableFrom(typeof(IBar)))

哪个更合适,为什么?


一个或另一个什么时候会失败?

如果您只想查看某个类型是否实现了给定的接口,则两者都可以,尽管GetInterface()可能更快,因为IsAssignableFrom()比GetInterface()执行更多的内部检查。检查.GetInterfaces()类型的结果可能会更快,它返回的内部列表与其他两个方法使用的内部列表相同。

编辑:这个答案是错误的!请参阅评论。

内部类的处理方式有所不同。参加以下课程:

public interface IFoo
{
}    

internal class Foo: IFoo
{
}
这将为您提供一个项目列表:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.GetInterface(typeof(IFoo).FullName) != null)
            .ToList();
然而,这将为您提供一个空列表:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.IsAssignableFrom(typeof(IFoo))
            .ToList();

这似乎不是真的。第一个将使您获得
Foo
,因为
IFoo
没有实现
IFoo
。第二个(注意,中缺少一个结束括号的
)将使您获得
IFoo
,因为您将参数的顺序设置为错误:
typeof(IFoo)。IsAssignableFrom(typeof(Foo))
是真的,因为您可以将
Foo
的一个实例放入声明类型的变量
IFoo
。内部的类型是不相关的。我继续做了一把小提琴来展示我的意思:@WaiHaLee谢谢你花时间来研究这个,还有小提琴。你完全正确。我很注意删除这个答案,因为它完全错了。呵呵,没关系。由于
IsAssignableFrom
的顺序很容易出错,因此有一个保留答案的理由。不知道他们为什么不把它叫做
DerivesFromOrImplements
,因为声明是
A:IInterface
,调用是
typeof(A)。DerivesFromOrImplements(typeof(IInterface))
。是的,这个名字很奇怪,我也很难记住。我有一个
IsAssignableTo
one-liner扩展方法来克服这个问题,这对我来说更直观。
var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.IsAssignableFrom(typeof(IFoo))
            .ToList();