Как получить базовый тип базового типа?
У меня есть три класса:
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();