在.NET中使用反射,什麼是之間的differnce:,IsAssignableFrom和GetInterface有什麼區別?
if (foo.IsAssignableFrom(typeof(IBar)))
而且
if (foo.GetInterface(typeof(IBar).FullName) != null)
哪個更合適,爲什麼呢?
什麼時候可以一個或另一個失敗?
在.NET中使用反射,什麼是之間的differnce:,IsAssignableFrom和GetInterface有什麼區別?
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();