? 1. 概述反射

          * 通過(guò)反射可以提供類型信息,從而使得我們開(kāi)發(fā)人員在運(yùn)行時(shí)能夠利用這些信息構(gòu)造和使用對(duì)象。?
          * ?反射機(jī)制允許程序在執(zhí)行過(guò)程中動(dòng)態(tài)地添加各種功能。??
          ? 2. Type類的介紹?

          * 是BCL(基底類別庫(kù))聲明的一個(gè)抽象類,所有它不能被實(shí)例化
          * 對(duì)于程序中用到的每一個(gè)類型,CLR(公共語(yǔ)言運(yùn)行時(shí))都會(huì)創(chuàng)建一個(gè)包含這個(gè)類型信息的Type類型的對(duì)象
          * 程序中用到的每一個(gè)類型都會(huì)關(guān)聯(lián)到獨(dú)立的Type類型的對(duì)象
          * 不管創(chuàng)建的類型有多少個(gè)實(shí)例,只有一個(gè)Type對(duì)象會(huì)關(guān)聯(lián)到所有這些實(shí)例
          2.1 Type類的部分常見(jiàn)成員

          成員 成員類型 描述
          Name 屬性 返回類型的名字
          FullName 屬性 返回?cái)?shù)據(jù)類型的完全限定名(包括命名空間名)
          NameSpace 屬性 返回包含數(shù)據(jù)類型聲明的命名空間
          Assembly 屬性 返回聲明類型的程序集。如果類型是泛型的,返回定義這個(gè)類型的程序集
          GetConstructor(), GetConstructors() 方法 返回ConstructorInfo類型,用于取得該類的構(gòu)造函數(shù)的信息
          GetEvent(), GetEvents() 方法 返回EventInfo類型,用于取得該類的事件的信息
          GetField(), GetFields() 方法 返回FieldInfo類型,用于取得該類的字段(成員變量)的信息
          GetInterface(), GetInterfaces() 方法 返回InterfaceInfo類型,用于取得該類實(shí)現(xiàn)的接口的信息
          GetMember(), GetMembers() 方法 返回MemberInfo類型,用于取得該類的所有成員的信息
          GetMethod(), GetMethods() 方法 返回MethodInfo類型,用于取得該類的方法的信息
          GetProperty(), GetProperties() 方法 返回PropertyInfo類型,用于取得該類的屬性的信息


          ? 3. 如何獲取Type類型

          ? ?3.1GetType()和typeof() 方法 兩者都是返回Syetem.Type的引用。(private和protected修飾的成員也可以訪問(wèn)到)

          ? ? ? ?3.1.1?GetType()

          ? ? ? ? ? ? ? 1.GetType()是從Syetem.object中基礎(chǔ)的方法。

          ? ? ? ? ? ? ? 2.GetType()必須要通過(guò)類型的實(shí)例點(diǎn)出這個(gè)方法。

          ? ? ? ?3.1.2 typeof()

          ? ? ? ? ? ? ??1.typeof(xx)是公開(kāi)的運(yùn)算符。

          ? ? ? ? ? ? ? 2.typeof(xx)中xx只能是int,string 等類型及自定義類型,不能是實(shí)例。

          ? ? ? 3.2 不同點(diǎn)

          ? ? ? ? ? ? 1.GetType()返回的是Type(類型)

          ? ? ? ? ? ? ? ?2.typeof(xx) 返回的是xx Class(類)的類型
          1 //實(shí)例一個(gè)用戶類 2 User user = new User(); 3 //GetType()方法 4 Type getType =
          user.GetType(); 5 //typeof(xx) 方法 6 Type typeOf = typeof(User); 7 //判斷是否相等 8
          if (getType == typeOf) 9 { 10 //這里相等 11 Console.WriteLine("我在這"); 12 }
          ?4.Type類方法? ? ? ??

          ? 1: 一旦有了Type對(duì)象就可以使用GetMethodInfo()方法獲取此類型支持的方法列表。該方法返回一個(gè)MethodInfo
          對(duì)象數(shù)組,MethodInfo對(duì)象描述了主調(diào)類型所支持的方法,他位于System.Reflection命名空間中

          ? 2:
          MethodInfo類派生于MethodBase抽象類,而MethodBase類繼承了MemberInfo類。因此我們能夠使用這三個(gè)類定義的屬性和方法。例如,使用Name屬性得到方法名稱。這里有兩個(gè)重要的成員:

          ? 3: ReturnType屬性 :為T(mén)ype類型的對(duì)象,能夠提供方法的返回類型信息 GetParameters()方法
          :返回參數(shù)列表,參數(shù)信息以數(shù)組形式保存在PatameterInfo對(duì)象中。PatameterInfo類定義了大量描述參數(shù)信息的屬性和方法。這里也列出兩個(gè)常用的屬性
          :Name(包含參數(shù)名稱信息的字符串),ParameterType(參數(shù)類型的信息)。
          //創(chuàng)建實(shí)例 Sublevel sublevel = new Sublevel(); //獲取類型 Type sublevelType =
          sublevel.GetType();//獲取類型的方法列表 //BindingFlags.NonPublic | BindingFlags.Instance
          | BindingFlags.Public 這個(gè)有一個(gè)注意點(diǎn)//
          實(shí)際上至少要有Instance(或Static)與Public(或NonPublic)標(biāo)記。否則將不會(huì)獲取任何方法。 MethodInfo[] obj =
          sublevelType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance |
          BindingFlags.Public);//遍歷所有的方法 foreach (MethodInfo item in obj) { //返回方法的返回類型
          Console.Write(item.ReturnType.Name);//返回方法的名稱 Console.Write(" "+item.Name+"(");
          //獲取方法的返回參數(shù)列表 ParameterInfo[] parameterss = item.GetParameters(); foreach (var
          parametersin parameterss) { //參數(shù)類型名稱
          Console.Write(parameters.ParameterType.Name);//參數(shù)名稱 Console.Write(" "
          +parameters.Name+","); } Console.WriteLine(")"); }


          ?

          執(zhí)行的結(jié)果,獲取了所有的方法,包括了方法的方法名稱,方法的返回類型,方法參數(shù)列表。

          5.方法的使用

          ? ? 前面我們講了放的顯示,但是只能看到不能用就不好了呀?。?!

          ? ? 5.1:GetMethods()方法的另一種形式

          ? ? ? ? 這種形式可以制定各種標(biāo)記,已篩選想要獲取的方法。他的通用形式為:MethodInfo[] GetMethods(BindingFlags
          bindingAttr)BindingFlags是一個(gè)枚舉,枚舉值有(很多只列出4個(gè)吧)

          * Instance:獲取實(shí)例方法
          * NonPublic: 獲取非公有方法
          * Public: 獲取共有方法
          * Static:獲取靜態(tài)方法
          ? ? ? ? GetMethods(BindingFlags bindingAttr)這個(gè)方法,參數(shù)可以使用or把兩個(gè)或更多標(biāo)記連接在一起,
          實(shí)際上至少要有Instance(或Static)與Public(或NonPublic)標(biāo)記。否則將不會(huì)獲取任何方法。del.GetType();

          ?
          public static void Method<T>(T model) { //獲取泛性的Type類型 Type objType =
          model.GetType();//獲取泛性的方法列表 MethodInfo[] mthodInfos = objType.GetMethods(); //
          循環(huán)方法 foreach (var item in mthodInfos) { //獲取方法的所有參數(shù)列表 var parameters =
          item.GetParameters();//過(guò)濾沒(méi)用方法 //1:查看是不是有參數(shù)的方法 //2:查看這個(gè)方法的返回類型是不是我們想要的 //
          3:查看這個(gè)方法的返回類型是不是我們想要的 if (parameters.Any() && parameters[0].ParameterType ==
          typeof(int) && item.ReturnType != typeof(void)) { //調(diào)用方法 object[] parametersObj
          =new object[] { 5 }; //調(diào)用實(shí)例方法 //
          第一個(gè)參數(shù)是我們的實(shí)體,后面是我們的參數(shù)(參數(shù)是一個(gè)數(shù)組,多個(gè)參數(shù)按照順序來(lái)傳遞,沒(méi)有參數(shù)可以為null)//如果我們的方法是一個(gè)靜態(tài)方法
          ,這個(gè)參數(shù)可以為null (不是靜態(tài)的就會(huì)報(bào)錯(cuò)) Console.WriteLine(item.Invoke(model, parametersObj));
          } } }
          ?



          ?

          ?

          6.DataTable轉(zhuǎn)Model(List)

          ? ?在剛剛學(xué).net
          的時(shí)候,我們從數(shù)據(jù)庫(kù)查詢出一個(gè)DataTable的時(shí)候想要轉(zhuǎn)成Model或者LIst的時(shí)候我們需要手動(dòng)的寫(xiě)遍歷,超級(jí)麻煩(在沒(méi)有接觸MVC的時(shí)候我就是)
          /// <summary> /// DataTable轉(zhuǎn)換 /// </summary> public class TransitionDataTable {
          /// <summary> /// DataTable轉(zhuǎn)換模型 /// </summary> /// <typeparam name="T">模型類型
          </typeparam> /// <param name="obj">模型</param> /// <param name="data">數(shù)據(jù)行</param>
          /// <returns></returns> public T DataSetBindModel<T>(T obj, DataTable data)
          where T : class, new() { T result = new T(); foreach (DataRow item in
          data.Rows) { result= assignmentClass(obj, item); } return result; } ///
          <summary> /// DataTable轉(zhuǎn)換List /// </summary> /// <typeparam name="T">模型類型
          </typeparam> /// <param name="obj">模型</param> /// <param name="data">數(shù)據(jù)行</param>
          /// <returns></returns> public List<T> DataSetBindList<T>(T obj, DataTable data)
          where T : class, new() { List<T> result = new List<T>(); foreach (DataRow item
          in data.Rows) { result.Add(assignmentClass(obj, item)); } return result; } ///
          <summary> /// DataRow 轉(zhuǎn)換成模型 /// </summary> /// <typeparam name="T">模型類型
          </typeparam> /// <param name="obj">模型</param> /// <param name="row">數(shù)據(jù)行</param>
          /// <returns></returns> private T assignmentClass<T>(T obj, DataRow row) where
          T :class, new() { if (obj == null) { obj = new T(); } Type type = obj.GetType();
          //得到類型的所有屬性,也就是表對(duì)應(yīng)的實(shí)體模型的所有屬性 //嗮選一下只要公開(kāi)的 PropertyInfo[] properts =
          type.GetProperties(BindingFlags.Instance | BindingFlags.Public); if
          (properts.Any()) {foreach (PropertyInfo item in properts) { if
          (row.Table.Columns.IndexOf(item.Name) != -1) { if (row[item.Name] != null &&
          row[item.Name] != DBNull.Value) { item.SetValue(obj, row[item.Name]); } } } }
          return obj; } } View Code
          調(diào)用
          static void Show() { DataTable data = new BDHelper().GetData("select * from
          Jack_News_TNews"); News news = new News(); var list = new
          TransitionDataTable().DataSetBindList(news, data); }
          ?

          ?

          ?

          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問(wèn)題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                久久这里只有精品999 | 蜜桃91精品秘 入口 | 国产白嫩警花被弄高潮 | 成人影视一区 | 无码毛片一区二区三区视频免费播 |