【发布时间】:2008-09-19 04:53:39
【问题描述】:
在.Net中使用反射,有什么区别:
if (foo.IsAssignableFrom(typeof(IBar)))
和
if (foo.GetInterface(typeof(IBar).FullName) != null)
哪个更合适,为什么?
一个或另一个什么时候会失败?
【问题讨论】:
标签: c# .net reflection
在.Net中使用反射,有什么区别:
if (foo.IsAssignableFrom(typeof(IBar)))
和
if (foo.GetInterface(typeof(IBar).FullName) != null)
哪个更合适,为什么?
一个或另一个什么时候会失败?
【问题讨论】:
标签: c# .net reflection
如果您只是想查看一个类型是否实现了给定的接口,任何一个都可以,尽管 GetInterface() 可能更快,因为 IsAssignableFrom() 比 GetInterface() 执行更多的内部检查。检查 Type.GetInterfaces() 的结果可能会更快,它返回的内部列表与其他两种方法都使用的相同。
【讨论】:
编辑:这个答案是错误的!请参阅 cmets。
内部类的处理方式有所不同。参加以下课程:
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。第二个(注意Where 缺少右括号)将得到IFoo,因为您将IsAssignableFrom 的参数顺序错误:typeof(IFoo).IsAssignableFrom(typeof(Foo)) 是正确的,因为您可以放置(分配)一个实例Foo 在声明类型为 IFoo 的变量中。内部类型是无关的。
IsAssignableFrom 的顺序很容易被弄错。不知道他们为什么不叫它DerivesFromOrImplements,因为声明是A : IInterface,而调用是typeof(A).DerivesFromOrImplements(typeof(IInterface))。
IsAssignableTo<T> 单行扩展方法来克服这个问题,这对我来说更直观。