В чем разница между IsAssignableFrom и GetInterface?
Используя отражение в .Net, в чем разница между:
if (foo.IsAssignableFrom(typeof(IBar)))
и
if (foo.GetInterface(typeof(IBar).FullName) != null)
Что более подходит, почему?
Когда может произойти сбой одного или другого?
Ответы
Ответ 1
Если вы просто хотите узнать, реализует ли какой-либо тип данного интерфейса, это нормально, хотя GetInterface(), вероятно, быстрее, поскольку IsAssignableFrom() выполняет больше внутренних проверок, чем GetInterface(). Вероятно, еще быстрее проверить результаты Type.GetInterfaces(), которые возвращают тот же внутренний список, что и другие методы используют в любом случае.
Ответ 2
Редактировать: этот ответ неверный! Пожалуйста, смотрите комментарии.
Есть разница в том, как обрабатываются внутренние классы. Возьмите следующий класс:
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();