【问题标题】:What is the difference between, IsAssignableFrom and GetInterface?IsAssignableFrom 和 GetInterface 有什么区别?
【发布时间】:2008-09-19 04:53:39
【问题描述】:

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

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

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

哪个更合适,为什么?

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

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      编辑:这个答案是错误的!请参阅 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 的变量中。内部类型是无关的。
      • 我继续做了一个小提琴来表明我的意思:dotnetfiddle.net/sv8TJY
      • @WaiHaLee 感谢您花时间研究这个问题,感谢您的提琴。你是绝对正确的。我注意删除这个答案,因为它完全是错误的。
      • 嘿——没关系。保留答案是有争议的,因为IsAssignableFrom 的顺序很容易被弄错。不知道他们为什么不叫它DerivesFromOrImplements,因为声明是A : IInterface,而调用是typeof(A).DerivesFromOrImplements(typeof(IInterface))
      • 是的,这个名字很奇怪,我也很难记住。我有一个IsAssignableTo<T> 单行扩展方法来克服这个问题,这对我来说更直观。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      相关资源
      最近更新 更多