Есть ли отражение в C#
предложении таким образом , чтобы определить , если некоторые заданные System.Type
модели типа некоторого интерфейса?
public interface IMyInterface {}
public class MyType : IMyInterface {}
// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);
c#
reflection
interface
Yippie-Ki-Yay
источник
источник
IsAssignableFrom
обратном направлении. Я пойду сGetInterfaces
сейчас: рIsAssignableFrom(t1)
Вариант примерно в 3 раза быстрее , чемGetInterfaces().Contains(t2)
аналог в моем коде.typeof(MyType).GetInterface(nameof(IMyInterface)) != null
улучшить безопасность типов и рефакторинг.Используйте
Type.IsAssignableFrom
:источник
или
источник
someclass is IMyInterface
в том, что он просто не требует затрат на рефлексию. Таким образом, хотя это не так, это не идеальный способ сделать это.is
проверяет в обоих направлениях иерархии наследования, тогда какIsAssignableFrom
проверяет только вверх. Также, если у вас есть экземпляр объекта, вы должны вызыватьIsInstanceOfType
(который также смотрит только вверх).Я думаю, что это правильный выпуск по трем причинам:
источник
Я только что сделал:
Я хотел бы сказать
where I : interface
, ноinterface
это не общий параметр ограничения параметра.class
настолько близко, насколько это возможно.Применение:
Я просто сказал,
Implements
потому что это более интуитивно понятно. Я всегдаIsAssignableFrom
шлепаюсь.источник
return typeof(I).IsInterface && typeof(I).IsAssignableFrom(source);
чтобы возвращать false при любом «неправильном» использовании метода, то есть; используя его с типом класса вместо типа интерфейса, вы можете вызвать исключение, если параметр типа не является интерфейсом. Хотя вы можете утверждать, что производный класс «реализует» его родителя ...Изменение ответа Джеффа для достижения оптимальной производительности (благодаря тесту производительности Пьера Арно):
Чтобы найти все типы, которые реализуют интерфейс в данном
Assembly
:источник
Как уже упоминал кто-то другой: Бенджамин 10 апреля '13 в 22:21
Что ж, другой путь - просто создать короткий метод расширения, который в некоторой степени соответствует «наиболее привычному» образу мышления (и согласился, что это очень маленький личный выбор, чтобы сделать его немного «более естественным» в зависимости от предпочтений). ):
И почему бы не пойти немного более обобщенно (ну, не уверен, действительно ли это так интересно, я полагаю, что я просто пропускаю очередную щепотку «синтаксического» сахара):
Я думаю, что это может быть гораздо более естественным, но, опять же, вопрос личного мнения:
источник
Boolean
=>bool
(я не знаю, почему у меня были строгие «причудливые» правила кодирования, когда я был моложе).Если у вас есть тип или экземпляр, вы можете легко проверить, поддерживают ли они определенный интерфейс.
Чтобы проверить, реализует ли объект определенный интерфейс:
Чтобы проверить, реализует ли тип определенный интерфейс:
Если вы получили универсальный объект и хотите выполнить приведение, а также проверить, реализован ли интерфейс, к которому вы приведете, код:
источник
IsAssignableFrom
сейчас перемещено вTypeInfo
:источник
Любой, кто ищет это, может найти следующий метод расширения полезным:
Тесты Xunit:
источник
что о
?
источник
Что о
источник
Правильный ответ
Однако,
может вернуть неправильный результат, как показано в следующем коде со строкой и IConvertible:
Результаты:
источник
IsAssignableFrom
. Так же, как предупреждают Бенджамин и Эуарн.Обратите внимание, что если у вас есть универсальный интерфейс,
IMyInterface<T>
он всегда будет возвращатьfalse
:Это тоже не работает:
Однако, если
MyType
реализуетIMyInterface<MyType>
это работает и возвращаетtrue
:Однако вы, вероятно, не будете знать параметр типа
T
во время выполнения . Несколько хакерское решение:Решение Джеффа немного менее хакерское:
Вот метод расширения,
Type
который работает для любого случая:(Обратите внимание, что выше используется linq, который, вероятно, медленнее, чем цикл.)
Затем вы можете сделать:
источник