.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...