Вопрос

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

   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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top