Как получить базовый тип базового типа?

У меня есть три класса:

public class TestEntity { }

public class BaseClass<TEntity> { }

public class DerivedClass : BaseClass<TestEntity> { }

Я уже получаю объект System.Type DerivedClass, используя отражение во время выполнения. Как я могу получить объект System.Type объекта TestEntity с помощью отражения?

Спасибо.

Ответ 1

Я предполагаю, что ваш код - всего лишь образец, и вы явно не знаете DerivedClass.

var type = GetSomeType();
var innerType = type.BaseType.GetGenericArguments()[0];

Обратите внимание, что этот код может работать очень легко во время выполнения, вы должны проверить, является ли тип, с которым вы работаете, - это то, что вы ожидаете от него:

if(type.BaseType.IsGenericType 
     && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>))

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

Ответ 2

Вы можете использовать свойство BaseType. Следующий код будет устойчивым для изменений в наследовании (например, если вы добавите еще один класс в середине):

Type GetBaseType(Type type)
{
   while (type.BaseType != null)
   {
      type = type.BaseType;
      if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(BaseClass<>))
      {
          return type.GetGenericArguments()[0];
      }
   }
   throw new InvalidOperationException("Base type was not found");
}

// to use:
GetBaseType(typeof(DerivedClass))

Ответ 3

var derivedType = typeof(DerivedClass);
var baseClass = derivedType.BaseType;
var genericType = baseClass.GetGenericArguments()[0];

Ответ 4

Думаю, это должно сработать:

var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault();

или

var someObject = new DerivedClass();
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault();