ジェネリック型の型パラメータは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
using System;
using System.Reflection;
class C<T> {}
class Sample {
static void Main()
{
var t = typeof(C<>);
DisplayType(t); // ジェネリック型
DisplayType(t.GetGenericArguments()[0]); // ジェネリック型の型パラメータ
DisplayType(Type.MakeGenericMethodParameter(0)); // ジェネリックメソッドの型パラメータ
}
static void DisplayType(Type t)
{
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();
}
}
実行結果
[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