ジェネリックと属性 (C# プログラミング ガイド)

属性は、非ジェネリック型の場合と同様に、ジェネリック型に適用できます。 属性の適用については、「属性」を参照してください。

カスタム属性は、型引数が与えられないオープン ジェネリック型と、すべての型パラメーターに引数が与えられる、構築クローズ ジェネリック型のみ参照が許可されます。

次の例では、このカスタム属性が使用されています。

class CustomAttribute : Attribute
{
    public object? info;
}

属性は、オープン ジェネリック型を参照できます。

public class GenericClass1<T> { }

[CustomAttribute(info = typeof(GenericClass1<>))]
class ClassA { }

適切な数のコンマを利用し、複数の型パラメーターを指定します。 この例では、GenericClass2 には 2 つの型パラメーターがあります。

public class GenericClass2<T, U> { }

[CustomAttribute(info = typeof(GenericClass2<,>))]
class ClassB { }

属性は、構築クローズ ジェネリック型を参照できます。

public class GenericClass3<T, U, V> { }

[CustomAttribute(info = typeof(GenericClass3<int, double, string>))]
class ClassC { }

ジェネリック型パラメーターを参照する属性は、コンパイル時エラーを引き起こします。

[CustomAttribute(info = typeof(GenericClass3<int, T, string>))]  //Error CS0416
class ClassD<T> { }

C# 11 以降では、ジェネリック型は Attribute から継承できます。

public class CustomGenericAttribute<T> : Attribute { }  //Requires C# 11

実行時にジェネリック型または型パラメーターに関する情報を取得するには、System.Reflection のメソッドを利用できます。 詳細については、「ジェネリックとリフレクション」を参照してください。

関連項目