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