C# 反射和特性(关于应用特性的更多内容)
关于应用特性的更多内容
至此,我们演示了特性的简单使用,都是为方法应用单个特性。本节将讲述特性的其他使
用方式。
多个特性
可以为单个结构应用多个特性。
- 多个特性可以使用下面任何一种格式列出。
- 独立的特性片段一个接一个。通常,它们彼此叠加,位于不同的行中。
- 单个特性片段,特性之间使用逗号分隔。
- 可以以任何次序列出特性。
例如,下面的两个代码片段显示了应用多个特性的两种方式。两个片段的代码是等价的。
[Serializable]
[MyAttribute("Simple class","Version 3.57")][MyAttribute("Simple class","Version 3.57"),Serializable]
其他类型的目标
除了类,还可以将特性应用到诸如字段和属性等其他程序结构。以下的声明显示了字段上的
特性以及方法上的多个特性:
[MyAttribute("Holds a value","Version 3.2")] //字段上的特性
public int MyField;[Obsolete]
[MyAttribute("Prints out a message","Version 3.6")] //方法上的特性
public void PrintOut()
{...
}
还可以显式地标注特性,从而将它应用到特殊的目标结构。要使用显式目标说明符,在特性
片段的开始处放置目标类型,后面跟冒号。例如,如下的代码用特性装饰方法,并且还把特性应
用到返回值上。
如表25-3所列,C#语言定义了10个标准的特性目标。大多数目标名是自解释的,而tyPe覆盖
了类、结构、委托、枚举和接口。typevar目标名称为使用泛型的结构指定类型参数。
----------------------------
event | field
method | param
property | return
type | typevar
assembly | module
----------------------------
全局特性
还可以通过使用assembly和module目标名称来使用显式目标说明符把特性设置在程序集或
模块级别。(程序集和模块在第22章中解释过。)有关程序集级别的特性的要点如下:
- 程序集级别的特性必须放置在任何命名空间之外,并且通常放置在AssemblyInfo.cs文件中;
- Assemblylnfo.cs文件通常包含有关公司、产品以及版权信息的元数据。
如下的代码行摘自Assemblylnfo.cs文件:
[assembly:AssemblyTitle("SuperWidget")]
[assembly:AssemblyDescription("Implements the SuperWidget product.")]
[assembly:AssemblyConfiguration("")]
[assembly:AssemblyCompany("McArthur Widget,Inc.")]
[assembly:AssemblyProduct("Super Widget Deluxe")]
[assembly:AssemblyCopyright("Copyright @ McArthur Widgets 2012)]
[assembly:AssemblyTradmark("")]
[assembly:AssemblyCulture("")]