<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NET基礎篇——反射的奧妙

      反射是一個程序集發現及運行的過程,通過反射可以得到*.exe或*.dll等程序集內部的信息。使用反射可以看到一個程序集內部的接口、類、方法、字段、屬性、特性等等信息。在System.Reflection命名空間內包含多個反射常用的類,下面表格列出了常用的幾個類。

      類型 作用
      Assembly 通過此類可以加載操縱一個程序集,并獲取程序集內部信息
      EventInfo 該類保存給定的事件信息
      FieldInfo 該類保存給定的字段信息
      MethodInfo 該類保存給定的方法信息
      MemberInfo 該類是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多個公用行為
      Module 該類可以使你能訪問多個程序集中的給定模塊
      ParameterInfo 該類保存給定的參數信息      
      PropertyInfo 該類保存給定的屬性信息

       

       

      一、System.Reflection.Assembly類

           通過Assembly可以動態加載程序集,并查看程序集的內部信息,其中最常用的就是Load()這個方法。

           Assembly assembly=Assembly.Load("MyAssembly");

           利用Assembly的object CreateInstance(string) 方法可以反射創建一個對象,參數0為類名。

       

       

      二、System.Type類

           Type是最常用到的類,通過Type可以得到一個類的內部信息,也可以通過它反射創建一個對象。一般有三個常用的方法可得到Type對象。

      1. 利用typeof() 得到Type對象

        Type type=typeof(Example);

      2. 利用System.Object.GetType() 得到Type對象

        Example example=new Example();

        Type type=example.GetType();

      3. 利用System.Type.GetType() 得到Type對象

        Type type=Type.GetType("MyAssembly.Example",false,true);

        注意參數0是類名,參數1表示若找不到對應類時是否拋出異常,參數1表示類名是否區分大小寫

         例子:

         我們最常見的是利用反射與Activator結合來創建對象。

         Assembly assembly= Assembly.Load("MyAssembly");

         Type type=assembly.GetType("Example");

         object obj=Activator.CreateInstance(type);

          

       

      三、反射方法

          1.通過 System.Reflection.MethodInfo能查找到類里面的方法

          代碼:

          Type type=typeof(Example);

          MethodInfo[] listMethodInfo=type.GetMethods();

          foreach(MethodInfo methodInfo in listMethodInfo)

               Cosole.WriteLine("Method name is "+methodInfo.Name);

        

         2.我們也能通過反射方法執行類里面的方法

         代碼:

         Assembly assembly= Assembly.Load("MyAssembly");

         Type type=assembly.GetType("Example");

         object obj=Activator.CreateInstance(type);

         MethodInfo methodInfo=type.GetMethod("Hello World");  //根據方法名獲取MethodInfo對象

         methodInfo.Invoke(obj,null);  //參數1類型為object[],代表Hello World方法的對應參數,輸入值為null代表沒有參數

       

       

      四、反射屬性

         1.通過 System.Reflection.PropertyInfo 能查找到類里面的屬性

           常用的方法有GetValue(object,object[]) 獲取屬性值和 SetValue(object,object,object[]) 設置屬性值

         代碼:

          Type type=typeof(Example);

          PropertyInfo[] listPropertyInfo=type.GetProperties();

          foreach(PropertyInfo propertyInfo in listPropertyInfo)

               Cosole.WriteLine("Property name is "+ propertyInfo.Name);

         

         2.我們也可以通過以下方法設置或者獲取一個對象的屬性值

         代碼:

         Assembly assembly=Assembly.Load("MyAssembly");

         Type type=assembly.GetType("Example");

         object obj=Activator.CreateInstance(type);

         PropertyInfo propertyInfo=obj.GetProperty("Name");    //獲取Name屬性對象

         var name=propertyInfo.GetValue(obj,null);                //獲取Name屬性的值

         PropertyInfo propertyInfo2=obj.GetProperty("Age");     //獲取Age屬性對象

         propertyInfo.SetValue(obj,34,null);                              //把Age屬性設置為34

       

       

      五、反射字段

          通過 System.Reflection.FieldInfo 能查找到類里面的字段

          它包括有兩個常用方法SetValue(object ,object )和GetValue(object)  因為使用方法與反射屬性非常相似,在此不再多作介紹

         (略)

       

       

      六、反射特性

         通過System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一個類里面的特性,以下例子可以反射出一個類的所有特性

         代碼:

         Type type=typeof("Example");

         object[] typeAttributes=type.GetCustomAttributes(false);       //獲取Example類的特性

         foreach(object attribute in typeAttributes)

               Console.WriteLine("Attributes description is "+attribute.ToString());

        

         通過下面例子,可以獲取Example類Name屬性的所有特性

         代碼:

         public class Example

         {

               [DataMemberAttribute]

               publics string Name

                {get;set;}

              ..................

          }

          Type type = typeof(Example);       
          PropertyInfo propertyInfo=type.GetProperty("Name");    //獲取Example類的Name屬性
          foreach (object attribute in propertyInfo.GetCustomAttributes(false))        //遍歷Name屬性的所有特性
                 Console.WriteLine(“Property attribute: "+attribute.ToString());

       

       

      七、常用實例

          雖然反射有很多奧妙之處,但要注意使用反射生成對象會耗費很多性能,所能必須了解反射的特性,在合適的地方使用。最常見例子就是利用單體模式與反射一并使用,  在BLL調用DAL的時候,通過一個反射工廠生成DAL實例。

      namespace Project.Common
      {
      public class Factory
      {
      //記錄dal的對象
      private static Hashtable dals;
      //用assemblyString記錄DAL程序集的全名稱
      private static string assemblyString = ConfigurationManager.AppSettings["LinqDAL"];
      private static Assembly assembly;

      static Factory()
      {
      dals = new Hashtable();
      assembly = Assembly.Load(assemblyString);
      }

      private static object CreateInstance(string typeName)
      {
      //當第一次加載時,將反射對象保存于dals集合里
      if (!dals.ContainsKey(typeName))
      {
      //創建反射對象
      object object1 = assembly.CreateInstance(typeName);

      if (object1 == null)
      throw new Exception("未能創建此對象");
      //把對象加入dals集合
      dals["typeName"] = object1;
      }
      return dals["typeName"];
      }

      public static IExampleDAL CreateExampleDAL()
      {
      return (IExampleDAL)CreateInstance(assemblyString + ".ExampleDAL");
      }
      }

      class Program
      {
      //利用工廠模式生成對象
      static void Main(string[] args)
      {
      IExampleDAL iExampleDAL=Factory.CreateExampleDAL();
      .................
      Console.ReadKey();
      }
      }
      }

      namespace Project.IDAL
      {
      public interface IExampleDAL
      {
      ///<summary>
      /// 插入Example行,若插入成功,則返回新增Example的行數
      ///</summary>
      ///<param name="example">Example對象</param>
      ///<returns>返回新增Example行數,默認值為-1</returns>
      int AddExample(Example example);

      ///<summary>
      /// 更新Example表,Update成功返回已經更新的數據條數,失敗返回-1
      ///</summary>
      ///<param name="example">Example對象</param>
      ///<returns>Update成功返回已經更新的數據條數,失敗返回-1</returns>
      int UpdateExample(Example example);

      ///<summary>
      /// 刪除Example表中ID等于exampleID的行,返回已刪除行數
      ///</summary>
      ///<param name="exampleID">Example對象的ID值</param>
      ///<returns>返回刪除行數</returns>
      int DeleteExample(int exampleID);

      ///<summary>
      /// 獲取Example表的所有行
      ///</summary>
      ///<returns>返回Example表中的所有Example對象</returns>
      IList<Example> GetList();

      ///<summary>
      /// 根據ID獲取對應Example對象
      ///</summary>
      ///<param name="id"></param>
      ///<returns></returns>
      Example GetExampleByID(int id);
      }
      }

      namespace Project.DAL
      {
      public class ExampleDAL:IExampleDAL
      {
      public int AddExample(Example example)
      {
      //實現AddExample方法
      ...........................
      }
      ..................................
      ..................................
      }
      }


      上面只是介紹了反射的基本用法,當然反射還有很多其他用途,下面幾篇文章將為大家一一介紹

       對 .NET  開發有興趣的朋友歡迎加入QQ群:162338858 共同探討 !

       

      .NET基礎篇

      以異步的方式操作TCP/IP套接字——以異步方式實現簡單的聊天室
      合理使用“.NET擴展方法”來簡化代碼(例子:空值判斷,利用擴展方法實現LINQ操作符ForEach)
      分部類和分部方法
      反射的奧妙
      利用泛型與反射更新實體(ADO.NET Entity Framework)

       

      作者:風塵浪子

      http://www.rzrgm.cn/leslies2/archive/2011/11/22/2257703.html

      原創作品,轉載時請注明作者及出處

       

      posted on 2011-11-22 12:08  風塵浪子  閱讀(23490)  評論(16)    收藏  舉報

      導航

      主站蜘蛛池模板: 欧美亚洲国产日韩电影在线| 777久久精品一区二区三区无码| 龙州县| 色综合 图片区 小说区| 少妇粗大进出白浆嘿嘿视频| 亚洲av本道一区二区| 在线高清免费不卡全码| 成人亚洲一区二区三区在线| 青青青爽在线视频观看| 国产不卡一区二区在线| 欧美做受视频播放| 久久综合干| 亚洲日产韩国一二三四区| 亚洲国产精品人人做人人爱| 久久一亚色院精品全部免费| 日本高清在线观看WWW色| 国产亚洲精品AA片在线播放天| 天堂va欧美ⅴa亚洲va在线| 久久国产精99精产国高潮| 性做久久久久久久久| 欧洲无码一区二区三区在线观看| 久热这里只精品视频99| 久久精品国产亚洲av麻豆不卡| 东方四虎在线观看av| 国产精品爽爽v在线观看无码 | 熟妇人妻系列aⅴ无码专区友真希| 懂色AV| 国产AV福利第一精品| 国产成人午夜精品福利| 人妻熟女一区无中文字幕| 无码国内精品人妻少妇| 国产精品亚洲一区二区z| 久久婷婷五月综合97色直播| 野外做受三级视频| 婷婷五月综合激情| 亚洲综合一区二区三区| 亚洲综合区激情国产精品| 少妇熟女久久综合网色欲| 男男车车的车车网站w98免费| 久久久久人妻一区精品| 一区二区三区国产不卡|