Предположим, следующие определения типов:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Как узнать, Foo
реализует ли тип универсальный интерфейс, IBar<T>
когда доступен только искаженный тип?
c#
.net
reflection
sduplooy
источник
источник
typeof(IBar<,,,>)
запятые действуют как заполнителиВы должны пройти через дерево наследования и найти все интерфейсы для каждого класса в дереве, и сравнить
typeof(IBar<>)
с результатом вызова, являетсяType.GetGenericTypeDefinition
ли интерфейс универсальным. Это все немного больно, конечно.Смотрите этот ответ и эти для получения дополнительной информации и кода.
источник
источник
Как расширение вспомогательного метода
Пример использования:
источник
Я использую немного более простую версию метода расширения @GenericProgrammers:
Использование:
источник
Вы должны проверить против созданного типа универсального интерфейса.
Вам нужно будет сделать что-то вроде этого:
потому что
IBar<String>
представляет этот построенный тип. Причина, по которой вы должны это сделать, заключается в том, что еслиT
в вашей проверке не определено, компилятор не знает, имеете ли вы в видуIBar<Int32>
илиIBar<SomethingElse>
.источник
Для того, чтобы полностью решить систему типа, я думаю , вам нужно работать с рекурсией, например
IList<T>
:ICollection<T>
:IEnumerable<T>
, без которых вы не знали бы , что вIList<int>
конечном счете орудияIEnumerable<>
.источник
Прежде всего
public class Foo : IFoo<T> {}
не компилируется, потому что вам нужно указать класс вместо T, но при условии, что вы делаете что-то вродеpublic class Foo : IFoo<SomeClass> {}
тогда, если вы делаете
источник
Если вам нужен метод расширения, который бы поддерживал базовые базовые типы, а также интерфейсы, я расширил ответ sduplooy:
источник
Метод проверки, если тип наследует или реализует универсальный тип:
источник
Попробуйте следующее расширение.
Чтобы проверить это. Создайте
и метод испытания
источник
Не должно быть ничего плохого в следующем:
Для дополнительного кредита вы можете перехватить AmbiguousMatchException, если вы хотите предоставить конкретный параметр generic-type-параметра в запросе IBar.
источник
bool implementsGeneric = (anObject.Implements(typeof(IBar<>).Name) != null);