程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 關於屬性的經典文章

關於屬性的經典文章

編輯:.NET實例教程

本文是轉載的.

屬性是自定義的元數據的標記和表現形式。  
  屬性的使用一般是被動的。  
  兩個部分組成:  
  屬性的頒發者和屬性的使用者。  
   
  屬性的頒發者聲明了某種意義。要求屬性的使用者把符合該意義的構造型(類,成員,,)標記上它。  
  那麼屬性的頒發者,就能通過根據它們是否有標記屬性,和屬性的數據進行某種操作了。  
   
  其中屬性的頒發者是主動地,而屬性的使用者是被動的。  
   
  對於平時,我們和我們創建的類只做為屬性的使用者。  
   
  例如對於可序列化的對象,我們只是定義:  
  [Serilizable]   public   class   NameInfo  
  {  
          private   string   n="Undefined";  
          public   string   Name  
          {  
                  get  
                  {  
                          return   n;  
                  }  
                  set  
                  {  
                          n=value;  
                  }  
          }  
  }  
  又例如在WebService裡用到的WebServiceAttribute和WebMethodAttribute  
   
  什麼時候我們才做屬性的頒布者,實現自己的屬性?  
   
  對於一般的

this);" target="_blank">應用,屬性是用不上的。通常的擴展都使用虛擬繼承來實現。  
  只有當你做的東西有自己或其他人進行擴展時,才考慮使用自定義屬性。  
   
  我這裡沒法說得明白。下面放個容易理解為什麼使用屬性的例子吧:  
  (這個例子需要些反射的知識)  
   
  using   System;  
  using   System.Reflection;  
   
  using   定義;  
  using   頒發者;  
  using   使用者;  
  using   程序;  
   
  namespace   定義  
  {  
  public   interface   IJob  
  {  
  void   Work();  
  }  
  }  
   
  namespace   頒發者  
  {  
  //定義一個Slow的屬性。它只能使用在方法上  
   
  [AttributeUsage(AttributeTargets.Method)]  
  public   class   SlowAttribute:Attribute  
  {  
  string   desc;  
  public   SlowAttribute(string   waitdesc)  
  {  
  desc=waitdesc;  
  }  
  public   string   WaitDescription  
  {  
  get  
  {  
  return   desc;  
  }  
  }  
  }  
  }  
   
  namespace   使用者  
  {  
  public   class   學習DotNet   :   IJob  
  {  
  public   void   Work()  
  {  
  Console.WriteLine("-->學習完畢");  
  }  
  }  
  public   class   精通DotNet   :   IJob  
  {  
  [Slow("很久")]  
  public   void   Work()  
  {  
  System.Threading.Thread.Sleep(3000);  
  Console.WriteLine("........................精通完畢");  
  }  
  }  
  }


   
  namespace   程序  
  {  
  public   interface   IJobExecutor  
  {  
  void   Execute(IJob   job);  
  }  
   
  class   Util  
  {  
  static   public   MethodInfo   FindJobWork(IJob   job)  
  {  
  InterfaceMapping   map=job.GetType().GetInterfaceMap(typeof(IJob));  
  return   map.TargetMethods[0];  
  }  
  }  
   
  public   class   浮躁的人   :   IJobExecutor  
  {  
  public   void   Execute(IJob   job)  
  {  
  MethodInfo   mi=Util.FindJobWork(job);  
  bool   isslow=mi.IsDefined(typeof(SlowAttribute),false);  
  if(!isslow)  
  {  
  job.Work();  
  Console.WriteLine("這麼點小東西還難得到我?");  
  }  
  else  
  {  
  Console.WriteLine("靠,這麼麻煩,老子不學了!!");  
  }  
  }  
  }  
  public   class   耐心的人   :   IJobExecutor  
  {  
  public   void   Execute(IJob   job)  
  {  
  MethodInfo   mi=Util.FindJobWork(job);  
  bool   isslow=mi.IsDefined(typeof(SlowAttribute),false);  
  if(!isslow)  
  {  
  job.Work();  
  Console.WriteLine("努力,加油。");  
  }  
  else  
  {  
  SlowAttribute   sa=(SlowAttribute)mi.GetCustomAttributes(typeof(SlowAttribute),false)[0];  
  Console.WriteLine("雖然做這個需要"+sa.WaitDescription+",但是我要把它完成。");  
  job.Work();  
  Console.WriteLine("哈哈。OK了");  
  }  
  }  
  }  
  }


   
  namespace   ConsoleApplication1  
  {  
  class   Class1  
  {  
  [STAThread]  
  static   void   Main(string[]   args)  
  {  
  IJob   j1=new   學習DotNet();  
  IJob   j2=new   精通DotNet();  
   
  IJobExecutor   exec1=new   浮躁的人();  
  IJobExecutor   exec2=new   耐心的人();  
   
  Console.WriteLine();  
  Console.WriteLine("廣播:浮躁的人的:");  
  Console.WriteLine();  
   
  Console.WriteLine("廣播:學習:");  
  exec1.Execute(j1);  
  Console.WriteLine("廣播:精通:");  
  exec1.Execute(j2);  
   
  Console.WriteLine();  
  Console.WriteLine("廣播:耐心的人的學習:");  
  Console.WriteLine();  
   
  Console.WriteLine("廣播:學習:");  
  exec2.Execute(j1);  
  Console.WriteLine("廣播:精通:");  
  exec2.Execute(j2);  
  }  
  }  
  }   
    
   


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved