1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //Attribute注解,Attribute是附加到方法、属性、类等上面的特殊的标签,在类Type信息初始化的加载 6 //无法再运行时修改 7 Type type = typeof(Person); 8 object[] attrs = 9 type.GetMethod("Hello").GetCustomAttributes(typeof(RuPengAttribute), false); 10 for (int i = 0; i < attrs.Length; i++) 11 { 12 RuPengAttribute ra = (RuPengAttribute)attrs[i]; 13 Console.WriteLine(ra.Name); 14 } 15 16 /* 17 Person p1 = new Person(); 18 p1.F1();*/ 19 // type = typeof(SqlConnection); 20 var methods = type.GetMethods(); 21 foreach (var method in methods) 22 { 23 object[] obAttrs = method.GetCustomAttributes(typeof(ObsoleteAttribute), false); 24 if (obAttrs.Length > 0) 25 { 26 ObsoleteAttribute oa = (ObsoleteAttribute)obAttrs[0]; 27 Console.WriteLine("注意,"+method.Name+"不再推荐使用,因为:"+oa.Message); 28 } 29 } 30 Console.ReadKey(); 31 } 32 } 33 34 [Obsolete("这个类不能用,否则后果自负")] 35 class Person 36 { 37 //在Hello方法的描述信息MethodInfo上粘了一个RuPengAttribute对象 38 //注解的值必须是常量,不能是动态算出来 39 //[RuPengAttribute(Name=DateTime.Now.ToString())] 40 //一般特性的类型都以Attribute结尾,这样用的时候就不用写“Attribute” 41 //Attribute:注解、注释、特性、属性。。。 42 [RuPeng(Name = "rupeng")] 43 public void Hello() 44 { 45 } 46 [Obsolete("这个方法有bug,我不想修复了,调用Hello可以达到同样的效果,而且没有没有bug")] 47 public void F1() 48 { 49 50 } 51 }
1 namespace ConsoleApplication2 2 { 3 [AttributeUsage(AttributeTargets.Method)] 4 class RuPengAttribute:Attribute 5 { 6 public RuPengAttribute() 7 { 8 } 9 10 public RuPengAttribute(string name) 11 { 12 this.Name = name; 13 } 14 15 public string Name { get; set; } 16 } 17 }