https://www.runoob.com/csharp/csharp-attribute.html
理解:
特性就是一个标签,可以给程序中的元素添加一些信息,在程序运行时就可以访问元素的这些信息,程序就可以通过这些信息进行其他操作。当然特性在编译期就存在了,所有编译器也可以通过这些特性信息进行条件编译。
1、定义:
(1) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
(2) 是一个标签,用于传递元素的信息。
(3) 元素:类、方法、结构、枚举、组件等。
2、内容:
(1) 通过放置在它所应用的元素前面的方括号([ ])来描述的。
(2) 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
(3) .Net 框架提供了两种类型的特性:预定义特性和自定义特性。
3、语法:
(1) 语法规则:
[attribute(positional_parameters, name_parameter = value, ...)]
element
(2) 特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。
positional_parameters 规定必需的信息;
name_parameter 规定可选的信息。
4、预定义特性:
(1) .Net 框架提供了三种预定义特性:AttributeUsage、Conditional、Obsolete。
(2) AttributeUsage
01. 描述了如何使用一个自定义特性类。它规定了特性应用范围。
02. 语法:
[AttributeUsage(validon, AllowMultiple = allowmultiple, Inherited = inherited)]
参数:
validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。
allowmultiple(可选的),如果为 true,则该特性是多用的。默认值是 false(单用的)。
inherited(可选的),如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。
03. 例如:
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
(3) Conditional
01. 标记方法为条件方法,表示方法的执行依赖于指定的预处理标识符。
02. 它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。突破#define,#undefine,#if,#endif的限制,而且更加灵活。
03. 语法如下:
[Conditional(conditionalSymbol)]
04. 例如:
[Conditional("DEBUG")] //只在DEBUG下编译执行,Release下不编译不执行
(4) Obsolete
01. 这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。
02. 语法如下:
[Obsolete(message)]
[Obsolete(message, iserror)]
参数:message,描述具体信息,如项目为什么过时以及该替代使用什么。
Iserror,如果该值为true,编译器则把该项目的使用当作一个错误。默认值是 false(编译器则只会生成一个警告)。
5、自定义特性:
(1) 特性也是一个类,可以创建自定义特性类,用来给元素添加信息,在运行中可以被访问。
(2) 所有特性类都派生自标准库提供的 Attribute 基类。
(2) 创建和使用的步骤:
01. 声明:声明自定义特性;
02. 定义:构建自定义特性;
03. 应用:在目标程序元素上应用特性;
04. 访问:通过反射访问特性。
(3) 声明:
声明自定义特性类:使用AttributeUsage特性标记,并继承System.Attribute 类。
(4) 定义:
定义特性类的具体内容,存储特性的具体内容。
每个特性必须至少有一个构造函数。必需的定位参数(positional)应通过构造函数传递。
(5) 访问:
01. 使用反射Reflection来访问特性attribute的信息。
02. 例如:
System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i++)
{
System.Console.WriteLine(attributes[i]);
}
(6) 特殊运用:如果特性的名称以 Attribute 结尾,那么可以在引用特性时省略这部分名称。
例如,可按如下方法使用 HelpAttribute。
[Help("xxx")]
public class Widget
{
[Help("xxx", Topic = "xxx")]
public void Display(string text)
{
}
}
来源:CSDN
作者:gubaofu
链接:https://blog.csdn.net/gubaofu/article/details/103753171