免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
.net core 反射的介紹與使用

  1. 概述反射

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

  2. Type類的介紹 

  • 是BCL(基底類別庫)聲明的一個(gè)抽象類,所有它不能被實(shí)例化
  • 對(duì)于程序中用到的每一個(gè)類型,CLR(公共語言運(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類的部分常見成員

    成員成員類型描述
    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修飾的成員也可以訪問到)

       3.1.1 GetType()

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

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

       3.1.2 typeof()

              1.typeof(xx)是公開的運(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屬性 :為Type類型的對(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 parameters in parameterss)                {                    //參數(shù)類型名稱                    Console.Write(parameters.ParameterType.Name);                    //參數(shù)名稱                    Console.Write(" "+parameters.Name+",");                }                Console.WriteLine(")");            }

 

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

5.方法的使用

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

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

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

  1. Instance:獲取實(shí)例方法
  2. NonPublic: 獲取非公有方法
  3. Public: 獲取共有方法
  4. 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();                //過濾沒用方法                //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ù)按照順序來傳遞,沒有參數(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ù)庫查詢出一個(gè)DataTable的時(shí)候想要轉(zhuǎn)成Model或者LIst的時(shí)候我們需要手動(dòng)的寫遍歷,超級(jí)麻煩(在沒有接觸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í)體模型的所有屬性            //嗮選一下只要公開的            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);        }

 

 

 

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
什么是反射、反射可以做些什么
C#高級(jí)編程之泛型一(泛型的引入、泛型的使用、何為泛型)
只只只
支付寶接口(剛完成,應(yīng)該是目前最好的了)-ASP.NET實(shí)例-www.knowsky.co...
C#基礎(chǔ)系列:小話泛型
深入反射生成數(shù)組的詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服