.net core 反射的介紹與使用

来源:https://www.cnblogs.com/chenxi001/archive/2019/11/20/11892308.html
-Advertisement-
Play Games

1. 概述反射 通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象。 反射機制允許程式在執行過程中動態地添加各種功能。 2. Type類的介紹 是BCL(基底類別庫)聲明的一個抽象類,所有它不能被實例化 對於程式中用到的每一個類型,CLR(公共語言運行時)都會創建一 ...


  1. 概述反射

  • 通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象。 
  •  反射機制允許程式在執行過程中動態地添加各種功能。  

  2. Type類的介紹 

  • 是BCL(基底類別庫)聲明的一個抽象類,所有它不能被實例化
  • 對於程式中用到的每一個類型,CLR(公共語言運行時)都會創建一個包含這個類型信息的Type類型的對象
  • 程式中用到的每一個類型都會關聯到獨立的Type類型的對象
  • 不管創建的類型有多少個實例,只有一個Type對象會關聯到所有這些實例

    2.1 Type類的部分常見成員

    成員 成員類型 描述
    Name 屬性 返回類型的名字
    FullName 屬性 返回數據類型的完全限定名(包括命名空間名)
    NameSpace 屬性 返回包含數據類型聲明的命名空間
    Assembly 屬性 返回聲明類型的程式集。如果類型是泛型的,返回定義這個類型的程式集
    GetConstructor(), GetConstructors() 方法 返回ConstructorInfo類型,用於取得該類的構造函數的信息
    GetEvent(), GetEvents() 方法 返回EventInfo類型,用於取得該類的事件的信息
    GetField(), GetFields() 方法 返回FieldInfo類型,用於取得該類的欄位(成員變數)的信息
    GetInterface(), GetInterfaces() 方法 返回InterfaceInfo類型,用於取得該類實現的介面的信息
    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中基礎的方法。

              2.GetType()必須要通過類型的實例點出這個方法。

       3.1.2 typeof()

              1.typeof(xx)是公開的運算符。

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

      3.2 不同點

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

               2.typeof(xx) 返回的是xx Class(類)的類型

 1  //實例一個用戶類
 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對象就可以使用GetMethodInfo()方法獲取此類型支持的方法列表。該方法返回一個MethodInfo 對象數組,MethodInfo對象描述了主調類型所支持的方法,他位於System.Reflection命名空間中

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

  3: ReturnType屬性 :為Type類型的對象,能夠提供方法的返回類型信息 GetParameters()方法 :返回參數列表,參數信息以數組形式保存在PatameterInfo對象中。PatameterInfo類定義了大量描述參數信息的屬性和方法。這裡也列出兩個常用的屬性 :Name(包含參數名稱信息的字元串),ParameterType(參數類型的信息)。

//創建實例
            Sublevel sublevel = new Sublevel();
            //獲取類型
            Type sublevelType = sublevel.GetType();
            //獲取類型的方法列表
            //BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public 這個有一個註意點
            //實際上至少要有Instance(或Static)與Public(或NonPublic)標記。否則將不會獲取任何方法。
            MethodInfo[] obj = sublevelType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            //遍歷所有的方法
            foreach (MethodInfo item in obj)
            {
                //返回方法的返回類型
                Console.Write(item.ReturnType.Name);
                //返回方法的名稱
                Console.Write(" "+item.Name+"(");
                //獲取方法的返回參數列表
                ParameterInfo[] parameterss = item.GetParameters();
                foreach (var parameters in parameterss)
                {
                    //參數類型名稱
                    Console.Write(parameters.ParameterType.Name);
                    //參數名稱
                    Console.Write(" "+parameters.Name+",");
                }
                Console.WriteLine(")");
            }

 

執行的結果,獲取了所有的方法,包括了方法的方法名稱,方法的返回類型,方法參數列表。

5.方法的使用

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

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

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

  1. Instance:獲取實例方法
  2. NonPublic: 獲取非公有方法
  3. Public: 獲取共有方法
  4. Static:獲取靜態方法

        GetMethods(BindingFlags bindingAttr)這個方法,參數可以使用or把兩個或更多標記連接在一起,實際上至少要有Instance(或Static)與Public(或NonPublic)標記。否則將不會獲取任何方法。del.GetType();

 

public static void Method<T>(T model) {
            //獲取泛性的Type類型
            Type objType = model.GetType();
            //獲取泛性的方法列表
            MethodInfo[] mthodInfos = objType.GetMethods();
            //迴圈方法
            foreach (var item in mthodInfos)
            {
                //獲取方法的所有參數列表
                var parameters = item.GetParameters();
                //過濾沒用方法
                //1:查看是不是有參數的方法
                //2:查看這個方法的返回類型是不是我們想要的
                //3:查看這個方法的返回類型是不是我們想要的
                if (parameters.Any() && 
                    parameters[0].ParameterType == typeof(int) &&
                    item.ReturnType != typeof(void))
                {
                    //調用方法
                    object[] parametersObj = new object[] { 5 };
                    //調用實例方法
                    //第一個參數是我們的實體,後面是我們的參數(參數是一個數組,多個參數按照順序來傳遞,沒有參數可以為null)
                    //如果我們的方法是一個靜態方法 ,這個參數可以為null (不是靜態的就會報錯)
                    Console.WriteLine(item.Invoke(model, parametersObj));
                }
            }
        }

 


 

 

6.DataTable轉Model(List)

   在剛剛學.net 的時候,我們從資料庫查詢出一個DataTable的時候想要轉成Model或者LIst的時候我們需要手動的寫遍歷,超級麻煩(在沒有接觸MVC的時候我就是)

 /// <summary>
    /// DataTable轉換
    /// </summary>
    public class TransitionDataTable
    {
        /// <summary>
        ///  DataTable轉換模型
        /// </summary>
        /// <typeparam name="T">模型類型</typeparam>
        /// <param name="obj">模型</param>
        /// <param name="data">數據行</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轉換List
        /// </summary>
        /// <typeparam name="T">模型類型</typeparam>
        /// <param name="obj">模型</param>
        /// <param name="data">數據行</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 轉換成模型
        /// </summary>
        /// <typeparam name="T">模型類型</typeparam>
        /// <param name="obj">模型</param>
        /// <param name="row">數據行</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();
            //得到類型的所有屬性,也就是表對應的實體模型的所有屬性
            //嗮選一下只要公開的
            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

調用

static void Show()
        {
            DataTable data = new BDHelper().GetData("select  *  from  Jack_News_TNews");
            News news = new News();
            var list = new TransitionDataTable().DataSetBindList(news, data);
        }

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Zuul在Web項目中的使用見上文《SpringBoot中使用Zuul》,下麵例子為Zuul在Spring Cloud的使用。 ...
  • Mybatis配置詳解 XML配置文件層次結構 下圖展示了mybatis config.xml的全部配置元素 properties元素 properties是一個配置屬性的元素,讓我們能在配置文件的上下文中使用它,MyBatis提供3種配置方式。 property子元素。 properties配置文 ...
  • 怎麼開通企業付款到零錢? 有的商戶號的產品中心是沒有這個功能的,不過,該功能的pid(product id)是5,只要隨便進去某一個產品,在地址欄把pid改為5。 即可進入該功能頁面,進行開通,不過要滿足條件。 用戶提現代碼: 1 //用戶微信提現 2 private function withdr ...
  • MATLAB實例:新建文件夾,保存.mat文件並保存數據到.txt文件中 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 用MATLAB實現:指定路徑下新建文件夾,將數據保存為.mat文件存放到新建的文件夾里,並將數據寫入.txt文件中,存放到新建的文 ...
  • 任何服務對資料庫的日常操作,都離不開增刪改查。如果一次查詢的紀錄很多,那我們必須採用分頁的方式。對於一個Springboot項目,訪問和查詢MySQL資料庫,持久化框架可以使用MyBatis,分頁工具可以使用github的 PageHelper。我們來看一下PageHelper的使用方法: 1 // ...
  • 作為程式員,在日常開發中,記憶猶新的莫過於寫代碼,升級程式。升級程式包含兩部分:一是,對服務程式更新;二是,對資料庫結構更新。本篇博文主要介紹資料庫結構更新,在對資料庫升級時,不知道園友們是否有如下經歷: 1)腳本文件中建表語句未作判斷是否存在,而導致執行失敗。 2)腳本文件中修改欄位在建表語句之前 ...
  • asp.net core 自定義 Policy 替換 AllowAnonymous 的行為 Intro 最近對我們的服務進行了改造,原本內部服務在內部可以匿名調用,現在增加了限制,通過 identity server 來管理 api 和 client,網關和需要訪問api的客戶端或api服務相互調用 ...
  • 交錯數組:數組元素本身也是一個數組 1 public static void Main(string[] args) 2 { 3 4 int[][] arr = new int[5][]; 5 arr[0] = new int[8]; 6 arr[1] = new int[8]; 7 arr[2] ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...