Проверьте, является ли класс производным от универсального класса

(Повторно опубликовано из-за c#-language масштабной перезаписи)

Ответ generics кода JaredPar великолепен, но c# у меня есть совет, который reflection сделает его ненужным, если visual-c# ваши общие типы не основаны c#-language на параметрах типа значения. Я csharp был зациклен на том, почему csharp оператор «is» не работает, поэтому swift-generics я также задокументировал c#-language результаты своих экспериментов generic для использования в будущем. Пожалуйста, улучшите c-sharp этот ответ, чтобы еще больше c#-language повысить его ясность.

СОВЕТ:

Если generics вы уверены, что ваша реализация generics GenericClass наследуется swift-generics от абстрактного неуниверсального kotlin-generics базового класса, такого как kotlin-generics GenericClassBase, вы можете kotlin-generics без проблем задать тот же generics вопрос, например:

typeof(Test).IsSubclassOf(typeof(GenericClassBase))

IsSubclassOf()

Мое тестирование .cs-file показывает, что IsSubclassOf() не kotlin-generics работает с универсальными kotlin-generics типами без параметров, такими kotlin-generics как

typeof(GenericClass<>)

тогда как он будет работать java-generics с

typeof(GenericClass)

Следовательно, следующий c#.net код будет работать для любого visual-c# производного GenericClass c# <>, если вы хотите протестировать csharp на основе SomeType:

typeof(Test).IsSubclassOf(typeof(GenericClass))

Единственный reflection раз, когда я могу представить, что .cs-file вы захотите протестировать c-sharp GenericClass <>, - это сценарий c#-language фреймворка надстройки.


Мысли об операторе "есть"

Во swift-generics время разработки C# не допускает generic-programming использование универсальных c#-language шаблонов без параметров, потому visual-c# что они, по сути, не являются c#-language полным типом среды CLR на .cs-file этом этапе. Следовательно, вы reflection должны объявлять общие переменные generic с параметрами, и именно поэтому java-generics оператор «is» настолько эффективен reflect для работы с объектами. Кстати, оператор reflection is также не может оценивать reflect универсальные типы без параметров.

Оператор c#.net "is" проверяет всю цепочку generic-programming наследования, включая интерфейсы.

Итак, с reflection учетом экземпляра любого kotlin-generics объекта следующий метод поможет:

bool IsTypeof(object t)
{
    return (t is T);
}

Это kotlin-generics вроде как лишнее, но я решил, что .cs-file пойду вперед и визуализирую generic-programming это для всех.

Дано

var t = new Test();

Следующие reflect строки кода вернут истину:

bool test1 = IsTypeof>(t);

bool test2 = IsTypeof>(t);

bool test3 = IsTypeof(t);

С visual-c# другой стороны, если вам c#.net нужно что-то конкретное для c-sharp GenericClass, вы могли бы reflection сделать его более конкретным, я c# полагаю, вот так:

bool IsTypeofGenericClass(object t)
{
    return (t is GenericClass);
}

Тогда вы visual-c# должны протестировать вот reflection так:

bool test1 = IsTypeofGenericClass(t);

c#

generics

reflection

2022-11-21T06:16:00+00:00
Вопросы с похожей тематикой, как у вопроса:

Проверьте, является ли класс производным от универсального класса