Как узнать тип generi c, переданный родителю - PullRequest
0 голосов
/ 27 мая 2020

Подскажите, пожалуйста, как можно определить тип, который был передан дженерикам параметров при наследовании

public abstract class BaseEntity 
{
}

public class DogEntity : BaseEntity
{
}

public interface IAnimal
{
}

public abstract class Animal<TEntity> : IAnimal
    where TEntity : BaseEntity
{
}

public class Dog : Animal<DogEntity>
{
}

У меня только тип сущности Dog, мне нужно получить DogEntity

Type type = typeof(Dog);

Буду признателен за любую помощь или подсказку

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

От собаки к животному - это классические случаи наследования, полиморфии, а не общие. Прямо там с формой / кругом / сферой. Это должно быть DogEntity : AnimalEntity и AnimalEntity : BaseEntity. Эта цепочка наследования действительно не имеет смысла.

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

Если вы когда-нибудь задумывались о типах с универсальными шаблонами с вероятностью 90%, у вас нет сценария универсальных шаблонов. Скорее всего, вы изобретаете переопределение заново. Я вижу, что люди часто тяготеют к генерикам + проверкам типов по ошибке, тогда как обычная старая полиморфия / переопределение будет ответом. Вероятно, это один из наиболее распространенных примеров проблемы XY в наши дни.

0 голосов
/ 27 мая 2020

Использование отражения

Type type = typeof(Dog)
    .BaseType
    .GetGenericArguments()
    .Single();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...