隨筆談反射Reflection創建三部曲 PS(只是談談基礎中的基礎!)

来源:http://www.cnblogs.com/Godlovezk/archive/2017/09/09/7497282.html
-Advertisement-
Play Games

step one:(找入口) using System.Reflection; //引用需要用到的命名空間 做任何事都要有開始的地方,不例外,反射也要先找到反射的入口,舉個慄子: Assembly assemble = Assembly.Load("SqlServer"); //反射的入口::動態的 ...


step one:(找入口)

  using System.Reflection; //引用需要用到的命名空間

  做任何事都要有開始的地方,不例外,反射也要先找到反射的入口,舉個慄子: Assembly assemble = Assembly.Load("SqlServer");  //反射的入口::動態的載入dll

step two:(獲類型)

  載入完DLL之後,根據類的完整名稱找到類型,再舉個慄子: Type type = assemble.GetType("SqlServer.Class1");  //SqlServer.Class1就是SqlServer中的一個類

知道類之後可以通過迴圈遍歷找到類中所有的方法名:

         

 Console.WriteLine("*************GetMethods**************");
          foreach (MethodInfo method in type.GetMethods())
          {
            Console.WriteLine("名稱{0}",method.Name);
          }

 

step three:(搞對象)

  下麵就要根據step two中獲取的類型創對象,有了對象一切就都好辦了,舉例:object oBject = Activator.CreateInstance(type);  //根據類型,創建對象,由於不知道對象類型所以只能object

 

再下來就是使用對象了,圍繞著對象做一些事情

具體的使用方法舉慄:

MethodInfo show1 = type.GetMethod("show1",new Type[] { }); //show1是類中的方法且是無參的
show1.Invoke(oBject,null);

MethodInfo show2 = type.GetMethod("show2", new Type[] { typeof(int) }); //show2方法是有參數的

show2.Invoke(oBject, new object[] { 22});

 

要放大招了,準備好!````````````````````````````````````````````````````````````````````簡直黑科技

你知道嗎,通過反射可以調用類的私有方法,只能說也是賊溜了。

MethodInfo show3 = type.GetMethod("show3", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);//通過反射調用私有方法
show3.Invoke(oBject, null);

 

附上SqlServer.Class1的代碼:

 

 

 

 1 public void show1()
 2 {
 3 
 4 Console.WriteLine("方法是{0}",this.GetType());
 5 
 6 }
 7 
 8 public void show2(int id)
 9 
10 {
11 
12 Console.WriteLine("這是show2方法(有參的){0}",id);
13 
14 }
15 
16 private void show3()
17 { 
18 Console.WriteLine("這是私有方法{0}",this.GetType());
19 }

 

同理 運用反射操作表結構----------------------------------------------------------

1.命名空間下的元素的預設訪問修飾符

public : 同一程式集的其他任何代碼或引用該程式集的其他程式集都可以訪問該類型或成員。

internal : 同一程式集中的任何代碼都可以訪問該類型或成員,但其他程式集不可以訪問。 

 

2.各類型中的成員的預設訪問修飾符

剩下的修飾符主要是正對繼承這個語言特性的,擁有繼承的類型有兩個類(class)和介面(interface)。public,internal同樣可以用於類型成員。

private : 同一類和結構的代碼可以訪問該類型和成員。

protected : 同一類和派生(繼承特性)類中的代碼可以訪問該類型和成員。

protected internal :  同一程式集中的任何代碼或其他程式集中的任何派生類都可以訪問該類型或成員。

 

MSDN提示 :

1.) 派生類的可訪問性不能高於其基類型。換句話說,不能有從內部類 A 派生的公共類 B。如果允許這種情況,將會使 A 成為公共類,因為 A 的所有受保護的成員或內部成員都可以從派生類訪問。 

2.) 成員的可訪問性決不能高於其包含類型的可訪問性。 

3.) 可以使用五種訪問類型中的任何一種來聲明類成員(包括嵌套的類和結構)。 

 

介面(interface)

介面成員訪問修飾符預設為public,且不能顯示使用訪問修飾符。

 

類(class)

構造函數預設為public訪問修飾符。

析構函數不能顯示使用訪問修飾符且預設為private訪問修飾符。 

類的成員預設訪問修飾符為private; 

 

枚舉(enum)

枚舉類型成員預設為public訪問修飾符,且不能顯示使用修飾符。

 

結構(struct) 

結構成員預設為private修飾符。 

結構成員無法聲明為protected成員,因為結構不支持繼承。 

 

嵌套類型

嵌套類型的預設訪問修飾符為private。 和類,結構的成員預設訪問類型一致。


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

-Advertisement-
Play Games
更多相關文章
  • 1 概述 1 概述 本篇文章主要從操作上簡要分析Controller<=>View之間相互傳值,關於頁面之間傳值,如果感興趣,可參考我另外一篇文章ASP.NET 頁面之間傳值的幾種方式 。 Controller=》View:Model,ViewBag,ViewData,TempData,ViewBa ...
  • 距離上次發東西已經過去了貌似不知多少天了,突然發現自己懶得總結了。這毛病感覺不好,還得寫點東西來充實一下自己,不然這樣整天渾渾噩噩的過日子,也太平淡了,不管怎麼說,起碼得給自己的經歷留下點東西吧。閑話不扯了,最近一直在忙著搞GIS的東西;國內主流的二大地圖:百度和高德地圖,確實直接調用SDK是很不錯 ...
  • 但是這種操作方式存在兩個問題:1.通過反射的方式,效率不高。2.如果是一個感測器,那麼定義的實時數據屬性不多;如果是一個站點(可以理解為生產單位或網關層)上傳的數據,可能有成千上萬監測點,那麼不可能在繼承DeviceDynamic介面的子類中定義這麼多屬性。 ...
  • 本篇作為技術分享系列的第一篇,詳細講一下 SVG 的解析和繪製,這部分功能的研究和最終實現由團隊的 @黃超超 同學負責,感謝提供技術文檔和支持。 首先我們來看一下 SVG 的文件結構和組成 SVG (Scalable Vector Graphics) 是一種可縮放矢量圖形,使用 XML 格式來定義, ...
  • 開篇先來說一下寫這篇文章的初衷。 初到來畫,通讀了來畫 UWP App 的代碼,發現裡面確實有很多比較高深的技術點,同時也是有很多問題的,擴展性,耦合,性能,功能等等。於是我們決定從頭重構這個產品,做一個全新的 “來畫Pro” 出來,歷經三個月的世間,這個產品終於正式上架。 (做個小廣告,在 Win ...
  • 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 8 namespace Wrox.Pro... ...
  • 上個月在網上看到一個用web實現簡單AR效果的文章,然後自己一路折騰,最後折騰出來一個 Asp.net+WebSocket+Emgucv實時人臉識別的東西,網上也有不少相關資料,有用winform的也有asp.net的。其實人臉識別技術早就成熟了,就是沒機會接觸這方面。百度了一下 找到好多,Jque ...
  • 本文主要介紹下運用docker虛擬技術打包Asp.net core應用。 Docker作為一個開源的應用容器引擎,近幾年得到廣泛的應用,使用Docker我們可以輕鬆實現應用的持續集成部署,一次打包,到處運行。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...