Как определить, реализует ли тип интерфейс с отражением C # - PullRequest
505 голосов
/ 11 февраля 2011

Предоставляет ли отражение в C# способ определения, если некоторые данные типа System.Type моделируют какой-либо интерфейс?

public interface IMyInterface {}

public class MyType : IMyInterface {}

// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);

Ответы [ 13 ]

0 голосов
/ 20 апреля 2019

Обратите внимание, что если у вас есть универсальный интерфейс IMyInterface<T>, он всегда будет возвращать false:

  typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */

Это также не работает:

  typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>))  /* ALWAYS FALSE */

Однако, если MyType реализует IMyInterface<MyType>, это работает и возвращает true:

  typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))

Однако вы, вероятно, не будете знатьпараметр типа T во время выполнения .Несколько хакерское решение:

  typeof(MyType).GetInterfaces()
                .Any(x=>x.Name == typeof(IMyInterface<>).Name)

Решение Джеффа немного менее хакерское:

  typeof(MyType).GetInterfaces()
         .Any(i => i.IsGenericType 
             && i.GetGenericTypeDefinition() == typeof(IMyInterface<>));

Вот метод расширения на Type, который работает для любогоcase:

public static class TypeExtensions
{
    public static bool IsImplementing(this Type type, Type someInterface)
    {
        return type.GetInterfaces()
             .Any(i => i == someInterface 
                 || i.IsGenericType 
                    && i.GetGenericTypeDefinition() == someInterface);
    }
}

(Обратите внимание, что в приведенном выше примере используется linq, который, вероятно, медленнее, чем цикл.)

Затем можно выполнить:

   typeof(MyType).IsImplementing(IMyInterface<>)
0 голосов
/ 08 ноября 2016

А как же

typeof(IWhatever).GetTypeInfo().IsInterface
0 голосов
/ 06 декабря 2015

а как же

if(MyType as IMyInterface != null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...