IsAssignableFrom和GetInterface有什么区别?

时间:2008-09-19 04:53:39

标签: c# .net reflection

在.Net中使用反射,有什么区别:

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

   if (foo.GetInterface(typeof(IBar).FullName) != null)

哪个更合适,为什么?

什么时候会失败?

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:1)

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

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();