Pytanie Jaka jest różnica między IsAssignableFrom a GetInterface?


Używając odbicia w .Net, jaka jest różnica między:

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

I

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

Które jest bardziej odpowiednie, dlaczego?

Kiedy jedno lub drugie może się nie powieść?


16
2017-09-19 04:53


pochodzenie




Odpowiedzi:


Jeśli chcesz tylko sprawdzić, czy dany typ implementuje dany interfejs, albo jest w porządku, chociaż GetInterface () jest prawdopodobnie szybszy, ponieważ IsAssignableFrom () wykonuje więcej wewnętrznych testów niż GetInterface (). Prawdopodobnie jeszcze szybciej sprawdzisz wyniki Type.GetInterfaces (), które zwracają tę samą wewnętrzną listę, której używają obie inne metody.


12
2017-09-19 04:55





Istnieje różnica w sposobie obsługi klas wewnętrznych. Weź następującą klasę:

public interface IFoo
{
}    

internal class Foo: IFoo
{
}

To da ci listę jednego przedmiotu:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.GetInterface(typeof(IFoo).FullName) != null)
            .ToList();

W ten sposób otrzymasz pustą listę:

var types = typeof(IFoo).Assembly.GetTypes()
            .Where(x => x.IsAssignableFrom(typeof(IFoo))
            .ToList();

1
2017-08-23 11:09