我們繼續C#基礎知識的學習這篇文章主要要講的是我們C#程序員邁向高級C#程序員的關鍵性的一步
有的朋友會說事實不是這樣的我不用反射就不能開發嗎?當然可以但是用與不用肯定是不一樣的任何復雜抽象的分層架構或者說是復雜的設計模式均是建立在這些基礎之上的比如我們要進行模塊化組件化開發要嚴格的消除模塊之間的耦合要進行動態接口調用這樣的強大而靈活的系統開發必須要用反射才行任何技術都有它存在的價值和意義只要我們把它用在合適的位置就能發揮出驚人的力量能盡可能的減少我們編寫的代碼更能是我們的代碼便的清晰簡潔
下面我們就來學習C#中的反射的概念以及怎麼使用它用它能為我們提供什麼樣的好處更重要的是能否將我們的技術台階提升一個高度
什麼叫反射
要想快速的學習一種技術首先我們要明白這個技術是干什麼的我們需要有個大局觀需要有個總體的認識了解才能發揮出每個人本能的理解能力而不是拉著你來理解我的想法只有這樣我們才能學的更快不知不覺我們就能形成自己一套獨立的思考能力[王清培版權所有轉載請給出署名]
自然解釋射是一種自然現象表現為受刺激物對刺激物的逆反應這是反射的字面解釋我們看一下計算機編程中的反射
編程解釋通過 SystemReflection 命名空間中的類以及 SystemType您可以獲取有關已加載的程序集和在其中定義的類型(如類接口和值類型)的信息 您也可以使用反射在運行時創建類型實例以及調用和訪問這些實例這是來自微軟官方的MSDN定義
通過這兩者的比較我想對於我們初學者來說反射就是通過某種事物去反射另一種事物我們小時候進行喜歡用鏡子對著牆上照會出現一個個小光圈這就是很典型的反射例子我們把它理解成計算機裡的反射就是我用某中對象去反射我無法直接獲取到的東西
這幅圖我想還是比較形象的至少在我們腦子裡已經有了這麼一個概念反射反射就是通過某種中間設備獲取到另一端的東西
C#裡面反射跟上面的概念是一樣的原理也是一樣的下面我們就用代碼示例來進行講解我想通過本篇文章的學習您一定可以很透徹的理解反射的概念
C#反射示例
在我的解決方案裡面有兩個項目Reflection是控制台應用程序TestDll是我們所要反射的項目在這個項目裡面我定義了一個Math類也就是我們要反射的對象
為了演示方便我們需要設置一下TestDll項目的生成輸出路徑也就是我們主程序的啟動目錄
這樣設置之後我們項目的輸出文件就會在我們應用程序的啟動目錄中反射也就會方便一點為了讓初學者能少走彎路我就費點事加上了
按F編譯一下會輸出TestDlldll文件到Reflection的Debug目錄中我們切換到Reflection中的Main方法中開始進行反射操作
view sourceprint?
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemReflection;
using SystemDiagnostics;
namespace Reflection
{
class Program
{
static void Main(string[] args)
{
Assembly dll = AssemblyLoadFile(EnvironmentCurrentDirectory + \\TestDlldll)
Type math = dllGetType(TestDllMath true)
MethodInfo method = mathGetMethod(add)
int count = (int)methodInvoke(null new object[] { })
ConsoleWriteLine(Invoke Method: + countToString())
ConsoleReadLine()
}
}
}
我在Math類中定義了一個靜態方法add在這裡我們就可以通過反射拿到Math對象進行動態調用了
Assembly對象就好比我們日常生活中的鏡子我用這個鏡子去照一下外部的DLL文件那個文件裡面的所有數據就可以反射給我了我在通過托管對象進行一系列的獲取調用了具體的對象讀者可以上網搜搜大牛們講解的比我詳細我只是做個入門介紹而已
總結是不是用反射很神奇我感覺反射真的很強大這篇文章只是反射的一個簡單的應用後面我會講解利用反射進行高配置的應用系統開發其實要想掌握一門語言的語法不難難的是語言背後的原理軟件是對硬件編程軟件的一切邏輯都是硬件的處理過程所以我們當務之急就是快速的學會使用一門語言然後去學習真正的軟件奧秘謝謝
From:http://tw.wingwit.com/Article/program/net/201311/13536.html