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

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

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

哪个更合适,为什么?

什么时候其中一个会失败?

有帮助吗?

解决方案

如果您只想查看某个类型是否实现给定的接口,则两者都可以,但 GetInterface() 可能更快,因为 IsAssignableFrom() 比 GetInterface() 执行更多的内部检查。检查 Type.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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top