小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

.net core 反射的介紹與使用

 行者花雕 2020-05-07

  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.方法的使用

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

    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);
        }

 

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多