В приведенном ниже примере я пытаюсь понять, почему BaseType
не является определением универсального типа и, в более общем смысле, почему оно не просто равно typeof(List<>)
public class MyList<T> : List<T>
{
}
// this is true by definition
typeof(List<>).IsGenericTypeDefinition
// this is false
// also the BaseType.FullName is null ?!?
// also BaseType.IsConstructedGenericType is true ?!?!?
// as such, BaseType != typeof(List<>)
typeof(MyList<>).BaseType.IsGenericTypeDefinition;
ИЗМЕНИТЬ. Вот несколько полезных ссылок по связанным темам:
Разница между Type.IsGenericTypeDefinition и Type.ContainsGenericParameters
Что такое открытый универсальный тип в .NET?
Generics - открытые и закрытые сконструированные типы
Определить, открыт ли общий тип?
https://docs.microsoft.com/en-us/dotnet/api/system.type.isgenerictype
Type.BaseType
охватывает все случаи, кроме случая определения универсального типа, поэтому, если вы хотите получить техническую информацию, результат даже не определен должным образом. На самом деле возвращается открытый типList<T>
с несвязаннымT
(т.е..GetGenericParameters()[0].IsGenericParameter == true
). Это небезосновательно, но до сих пор не задокументировано. - person Jeroen Mostert   schedule 02.12.2019