1.特性声明
所有特性类都直接或间接派生自 System.Attribute
基类。
以下示例声明了 HelpAttribute
特性。
using System;
public class HelpAttribute : Attribute
{
string _url;
string _topic;
public HelpAttribute(string url) => _url = url;
public string Url => _url;
public string Topic
{
get => _topic;
set => _topic = value;
}
}
2.调用特性
调用特性时,通过用方括号 ([]
) 将特性名称以及实参括起来,并置于应用该特性的实体的声明上方。可以将多个特性附加到实体的声明上。对于给定实体,一些特性可以指定多次。
按位置传递的参数与特性构造函数的参数相对应,按命名传递的参数与该特性的属性或字段相对应。
如果特性的名称以 Attribute
结尾,那么可以在调用特性时省略 Attribute
。
[Help("http://msdn.microsoft.com/.../MyClass.htm")]
public class Widget
{
[Help("http://msdn.microsoft.com/.../MyClass.htm", Topic = "Display")]
public void Display(string text) {}
}
3.特性目标
默认情况下,特性应用于紧跟在它后面的元素。特性目标是显式的指定此特性应用于哪个目标。
[target : attribute-list]
NonSerializedAttribute 只能附加到字段,不能附加到属性。可使用特性上的 field:
说明符将 NonSerializedAttribute 附加到 Id
属性的支持字段,如下例所示:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
[field:NonSerialized]
public int Id { get; set; }
public string FullName => $"{FirstName} {LastName}";
}
target值 | 应用场景 |
---|---|
assembly | 整个程序集 |
module | 当前程序集模块 |
field | 类或结构中的字段 |
event | 事件 |
method | 方法或 get 和 set 属性访问器 |
param | 方法参数或 set 属性访问器参数 |
property | 属性 |
return | 方法、属性索引器或 get 属性访问器的返回值 |
type | 结构、类、接口、枚举或委托 |
4.特性命名
特性的命名按照PascalCase + Attribute
方式,虽然编译器不强制带Attribute
结尾,但这是良好的编码习惯。
但是,如果两个短名称相同,并且一个类型名称包含 Attribute 后缀而另一类型名称不包含,则会出现命名冲突。可以使用 @
字符指定是调用全名。
using System;
[AttributeUsage(AttributeTargets.Class)]
public class Info : Attribute
{
private string information;
public Info(string info)
{
information = info;
}
}
[AttributeUsage(AttributeTargets.Method)]
public class InfoAttribute : Attribute
{
private string information;
public InfoAttribute(string info)
{
information = info;
}
}
// Generates compiler error CS1614. Ambiguous Info and InfoAttribute.
[Info("A simple executable.")]
// Prepend '@' to select 'Info' ([@Info("A simple executable.")]). Specify the full name 'InfoAttribute' to select it.
public class Example
{
[InfoAttribute("The entry point.")]
public static void Main()
{
}
}
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/11487.html