В чем разница между IsAssignableFrom и GetInterface? - PullRequest
16 голосов
/ 19 сентября 2008

Используя отражение в .Net, в чем разница между:

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

И

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

Что более уместно, почему?

Когда один или другой мог потерпеть неудачу?

Ответы [ 2 ]

12 голосов
/ 19 сентября 2008

Если вы просто хотите увидеть, реализует ли тип заданный интерфейс, то все в порядке, хотя GetInterface (), вероятно, быстрее, поскольку IsAssignableFrom () выполняет больше внутренних проверок, чем GetInterface (). Возможно, еще быстрее будет проверить результаты Type.GetInterfaces (), который возвращает тот же внутренний список, который в любом случае используют оба других метода.

1 голос
/ 23 августа 2017

Существует разница в том, как обрабатываются внутренние классы. Возьмите следующий класс:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...