特性可按与非泛型类型相同的方式应用到泛型类型。 但是,只能将特性应用于开放式泛型类型和封闭式构造泛型类型,而不能应用于部分构造泛型类型。 开放式泛型类型是未指定任何类型参数的类型,例如 ;封闭式构造泛型类型指定所有类型参数,例如 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 方法。 有关详细信息,请参阅泛型和反射。