泛型和特性

特性可按与非泛型类型相同的方式应用到泛型类型。 但是,只能将特性应用于开放式泛型类型和封闭式构造泛型类型,而不能应用于部分构造泛型类型。 开放式泛型类型是未指定任何类型参数的类型,例如 ;封闭式构造泛型类型指定所有类型参数,例如 Dictionary<TKey, TValue>。 部分构造泛型类型指定一些(而非全部)类型参数。 示例为 Dictionary<string, TValue>未绑定泛型类型是省略类型参数的泛型类型,例如Dictionary<,>

以下示例使用此自定义属性:

class CustomAttribute : Attribute
{
    public object? info;
}

属性可以引用未绑定的泛型类型:

public class GenericClass1<T> { }

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

通过使用适当数量的逗号指定多个类型参数。 在此示例中,GenericClass2 具有两个类型参数:

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 方法。 有关详细信息,请参阅泛型和反射

另请参阅