IsAssignableFrom, когда интерфейс имеет обобщенные значения, но не реализацию - PullRequest
3 голосов
/ 30 мая 2011

Я искал это и нашел это: Как определить, является ли тип другим универсальным типом

Проблема с этим решением заключается в том, что реализация ожидает того же типапараметры.Я хочу увидеть, реализует ли класс интерфейс с каким-либо параметром типа.

Пример:

public interface IMapper<in TSource, out TDestination>
{ ... }

public class StringMapper : IMapper<string, StringBuilder>
{ ... }

Console.WriteLine(typeof(IMapper<,>).IsAssignableFrom(typeof(StringMapper)));

Я хочу, чтобы это записывало true, но записывало false.Как я могу проверить, реализует ли класс интерфейс с общими параметрами?

Ответы [ 2 ]

6 голосов
/ 30 мая 2011

Я думаю, вам нужно позвонить GetInterfaces() из вашего StringMapper и проверить каждый на IsGenericType.И последнее, но не менее важное: получите открытый тип (IMapper<,>) каждого универсального, вызвав GetGenericTypeDefinition() и проверьте, соответствует ли он typeof(IMapper<,>).

Это все, что вы можете сделать.Но учтите, что если класс наследует от другого базового класса, который также реализует некоторые интерфейсы, они не будут перечислены.В этом случае вы должны повторно просмотреть свойства BaseType и выполнять приведенные выше действия, пока BaseType не станет нулевым.

3 голосов
/ 28 июля 2012

работал как шарм для меня. Вот фрагмент кода на случай, если кому-то интересно:

    IEnumerable<Type> reports =
        from type in GetType().Assembly.GetTypes()
        where
            type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IReport<>)) &&
            type.IsClass
        select type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...