ジェネリック型の型パラメータはType.GetGenericArgumentsメソッドによって取得することができ、ジェネリックメソッドの型パラメータはType.MakeGenericMethodParameterメソッド(.NET Standard 2.1/.NET Core 2.1以降)によって作成することができます。 (詳細:§.型パラメータを指定した取得 (ジェネリック型のメソッド/ジェネリックメソッドの取得))
Typeが型パラメータを表すかどうかは、IsGenericParameterプロパティによって判別することができます。 また、ジェネリック型の型パラメータかどうかはIsGenericTypeParameterプロパティ、ジェネリックメソッドの型パラメータかどうかはIsGenericMethodParameterプロパティによって判別することができます。
Typeがジェネリック型の型パラメータか、ジェネリックメソッドの型パラメータかを調べる .NET Standard 2.1/.NET Core 2.1
Imports System
Imports System.Reflection
Class C(Of T)
End Class
Class Sample
Shared Sub Main()
Dim t As Type = GetType(C(Of))
DisplayType(t) ' ジェネリック型
DisplayType(t.GetGenericArguments()(0)) ' ジェネリック型の型パラメータ
DisplayType(Type.MakeGenericMethodParameter(0)) ' ジェネリックメソッドの型パラメータ
End Sub
Shared Sub DisplayType(ByVal t As Type)
Console.WriteLine($"[{t}]")
Console.WriteLine($"{nameof(Type.IsGenericType)}? {t.IsGenericType}")
Console.WriteLine($"{nameof(Type.IsGenericParameter)}? {t.IsGenericParameter}")
Console.WriteLine($"{nameof(Type.IsGenericTypeParameter)}? {t.IsGenericTypeParameter}")
Console.WriteLine($"{nameof(Type.IsGenericMethodParameter)}? {t.IsGenericMethodParameter}")
Console.WriteLine()
End Sub
End Class
実行結果
[C`1[T]] IsGenericType? True IsGenericParameter? False IsGenericTypeParameter? False IsGenericMethodParameter? False [T] IsGenericType? False IsGenericParameter? True IsGenericTypeParameter? True IsGenericMethodParameter? False [!!0] IsGenericType? False IsGenericParameter? True IsGenericTypeParameter? False IsGenericMethodParameter? True