MyClass<int>
- это сконструированный тип , поэтому в отношении времени выполнения параметр Foo
равен int
, а не универсальный c параметр , Сравните это с универсальным c методом Foo<T>
, где среда выполнения не знает, что такое тип T
, и знает только, что это параметр generi c.
Поэтому вам следует использовать открытый тип, такой как MyClass<>
:
Console.WriteLine("pos: " + typeof(MyClass<>)
.GetMethod("Foo")
.GetParameters()
.Single()
.ParameterType
.GenericParameterPosition);
Таким образом, тип параметра Foo
распознается как универсальный параметр c.
Вы также можете использовать GetGenericTypeDefnition
чтобы изменить составной тип на открытый тип:
Console.WriteLine("pos: " + typeof(MyClass<int>)
.GetGenericTypeDefinition()
...
Это полезно, если объект Type
приходит откуда-то, что вы не можете контролировать.