C#中的特性和反射

预定义特性和自定义特性。

三种预定义特性:

  • AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。
  • [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property, 
    AllowMultiple = true)]
  • Conditional 预定义特性标记了一个条件方法,其执行依赖于它顶的预处理标识符。
  • #define DEBUGXXS
    using System;
    using System.Diagnostics;
    public class Myclass
    {
        [Conditional("DEBUGXXS")]
        public static void Message(string msg)
        {
            Console.WriteLine(msg);
        }
    }
    class Test
    {
        static void function1()
        {
            Myclass.Message("In Function 1.");
            function2();
        }
        static void function2()
        {
            Myclass.Message("In Function 2.");
        }
        public static void Main()
        {
            Myclass.Message("In Main function.");
            function1();
            Console.ReadKey();
        }
    }

    Obsolete 个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素.
  • using System;
    public class MyClass
    {
       [Obsolete("Don't use OldMethod, use NewMethod instead", true)]
       static void OldMethod()
       { 
          Console.WriteLine("It is the old method");
       }
       static void NewMethod()
       { 
          Console.WriteLine("It is the new method"); 
       }
       public static void Main()
       {
          OldMethod();
       }
    }

  • 自定义特性包含四个步骤:

    • 声明自定义特性
    • 构建自定义特性
    • 在目标程序元素上应用自定义特性
    • 通过反射访问特性

    反射指程序可以访问、检测和修改它本身状态或行为的一种能力。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
  • 反射(Reflection)有下列用途:

    • 它允许在运行时查看属性(attribute)信息。
    • 它允许审查集合中的各种类型,以及实例化这些类型。
    • 它允许延迟绑定的方法和属性(property)。
    • 它允许在运行时创建新类型,然后使用这些类型执行一些任务。

  • 例子中 使用反射(Reflection)来读取 Rectangle 类中的元数据

  • using System;
    using System.Reflection;
    namespace BugFixApplication
    {
       // 一个自定义属性 BugFix 被赋给类及其成员
       [AttributeUsage(AttributeTargets.Class |
       AttributeTargets.Constructor |
       AttributeTargets.Field |
       AttributeTargets.Method |
       AttributeTargets.Property,
       AllowMultiple = true)]
    
       public class DeBugInfo : System.Attribute
       {
          private int bugNo;
          private string developer;
          private string lastReview;
          public string message;
    
          public DeBugInfo(int bg, string dev, string d)
          {
             this.bugNo = bg;
             this.developer = dev;
             this.lastReview = d;
          }
    
          public int BugNo
          {
             get
             {
                return bugNo;
             }
          }
          public string Developer
          {
             get
             {
                return developer;
             }
          }
          public string LastReview
          {
             get
             {
                return lastReview;
             }
          }
          public string Message
          {
             get
             {
                return message;
             }
             set
             {
                message = value;
             }
          }
       }
       [DeBugInfo(45, "Zara Ali", "12/8/2012",
    	Message = "Return type mismatch")]
       [DeBugInfo(49, "Nuha Ali", "10/10/2012",
    	Message = "Unused variable")]
       class Rectangle
       {
          // 成员变量
          protected double length;
          protected double width;
          public Rectangle(double l, double w)
          {
             length = l;
             width = w;
          }
          [DeBugInfo(55, "Zara Ali", "19/10/2012",
    	   Message = "Return type mismatch")]
          public double GetArea()
          {
             return length * width;
          }
          [DeBugInfo(56, "Zara Ali", "19/10/2012")]
          public void Display()
          {
             Console.WriteLine("Length: {0}", length);
             Console.WriteLine("Width: {0}", width);
             Console.WriteLine("Area: {0}", GetArea());
          }
       }//end class Rectangle  
       
       class ExecuteRectangle
       {
          static void Main(string[] args)
          {
             Rectangle r = new Rectangle(4.5, 7.5);
             r.Display();
             Type type = typeof(Rectangle);
             // 遍历 Rectangle 类的属性
             foreach (Object attributes in type.GetCustomAttributes(false))
             {
                DeBugInfo dbi = (DeBugInfo)attributes;
                if (null != dbi)
                {
                   Console.WriteLine("Bug no: {0}", dbi.BugNo);
                   Console.WriteLine("Developer: {0}", dbi.Developer);
                   Console.WriteLine("Last Reviewed: {0}",
    					dbi.LastReview);
                   Console.WriteLine("Remarks: {0}", dbi.Message);
                }
             }
             
             // 遍历方法属性
             foreach (MethodInfo m in type.GetMethods())
             {
                foreach (Attribute a in m.GetCustomAttributes(true))
                {
                   DeBugInfo dbi = (DeBugInfo)a;
                   if (null != dbi)
                   {
                      Console.WriteLine("Bug no: {0}, for Method: {1}",
    						dbi.BugNo, m.Name);
                      Console.WriteLine("Developer: {0}", dbi.Developer);
                      Console.WriteLine("Last Reviewed: {0}",
    						dbi.LastReview);
                      Console.WriteLine("Remarks: {0}", dbi.Message);
                   }
                }
             }
             Console.ReadLine();
          }
       }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值