一:前言
通过特性与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用反射技术查询特性
可以通过使用特性向程序添加声明性信息,一个声明性标签是通过放置在它所应用的元素前面的方括号[ ]来描述的
二:使用
——Conditional
可以为一个方法添加Conditional特性使这个方法的执行依赖于指定的预处理标识符
#define Debug using System; using System.Diagnostics; class MainClass { public static void Main() { Fun1(); Fun2(); } [Conditional("Debug")] public static void Fun1() { Console.WriteLine("Fun1"); } public static void Fun2() { Console.WriteLine("Fun2"); } }
——Obsolete
可以为类、属性、字段、方法添加Obsolete特性使这个目标元素标记为过时的
Obsolete特性的第二个参数是否为error默认为false,不影响编译通过只会提示warning,如果为true则编译不会通过
public class Test { [Obsolete] public int a; [Obsolete("use a instead")] public int b; [Obsolete("", true)] public void Fun(){} }
——自定义特性
步骤:
——构建一个自定义特性[AttributeUsage()]
——编写一个自定义特性类,类名必须以Attribute结尾并继承自Attribute类
——将定位的参数通过构造函数传递(每个自定义特性类必须至少有一个构造函数)
——通过反射检索到特性信息
using System; class MainClass { public static void Main() { Test test = new Test(); Type t = test.GetType(); object[] o = t.GetCustomAttributes(true); TestAttribute attribute = (TestAttribute)o[0]; Console.WriteLine(attribute.msg); } } [Test("这是测试类")] public class Test { } [AttributeUsage(AttributeTargets.All)] public class TestAttribute : Attribute { public string msg; public TestAttribute(string msg) { this.msg = msg; } }
本文摘自 :https://blog.51cto.com/u