反射是.net中的重要機制,通過反射可以得到*.exe或*.dll等程式集內部的介面、類、方法、字段、屬性、特性等資訊,還可以動態建立出型別例項並執行其中的方法。
反射的功能很強大,任何複雜抽象的分層架構或者複雜的設計模式均是建立在這些基礎之上的,比如我們要進行模組化、元件化開發,要嚴格的消除模組之間的耦合,要進行動態介面呼叫。開發這樣強大而靈活的系統,必須要用反射才行,我們只要把它用在合適的位置,不僅能使**變的清晰簡潔,更能讓它發揮出驚人的力量。
型別
作用assembly
定義和引導程式集,引導程式集清單中列出的模組,以及從此程式集中查詢型別並建立該型別的例項。
module
了解包含模組的程式集以及模組中的類等,還可以獲取在模組上定義的所有全域性方法或其他特定的非全域性方法。
constructorinfo
了解構造器的名稱、引數、訪問修飾符(如public或private)和實現詳細資訊(如abstract或virtual)等。使用type的getconstructors或getconstructor方法來呼叫特定的建構函式。
methodinfo
了解方法的名稱、返回型別、引數、訪問修飾符(如public或private)和實現詳細資訊(如abstract或virtual)等。使用type的getmethods或getmethod方法來呼叫特定的方法。
fieldinfo
了解欄位的名稱、訪問修飾符(如public或private)和實現詳細資訊(如static)等,並獲取或設定字段值。
eventinfo
了解事件的名稱、事件處理程式資料型別、自定義特性、宣告型別和反射型別等,並新增或移除事件處理程式。
propertyinfo
了解屬性的名稱、資料型別、宣告型別、反射型別和唯讀或可寫狀態等,並獲取或設定屬性值。
parameterinfo
了解引數的名稱、資料型別、引數是輸入引數還是輸出引數等,以及引數在方法簽名中的位置等。
public執行結果void
getassenblyinfo()
",assemb.fullname);
console.writeline(
"程式集的版本:
", assemb.getname().version);
console.writeline(
"程式集初始位置:
", assemb.codebase);
console.writeline(
"程式集位置:
", assemb.location);
console.writeline(
"程式集入口:
", assemb.entrypoint);
type types =assemb.gettypes();
foreach (var item in
types)
}
"類全名:
", type.fullname);
console.writeline(
"命名空間:
", type.namespace);
console.writeline(
"程式集名:
", type.assembly);
console.writeline(
"模組名:
", type.module);
console.writeline(
"基類名:
", type.basetype);
console.writeline(
"是否類:
", type.isclass);
console.writeline(
"類的公共成員:");
memberinfo members =type.getmembers();
foreach (memberinfo memberinfo in
members)
:", memberinfo.membertype, memberinfo);}}
執行結果:
1. 呼叫抽象類
publicvoid
testfactormethod()
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
namespace
reflectiontest.fruits
public
abstract
void
show();}}
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.reflection;
namespace
reflectiontest.fruits
public
static t createinstance(string
fulltypename)}}
C 反射機制
反射的概述 反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等。system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 syste...
C 反射機制
反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等。system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 system.refl...
C 反射機制
參考 本文的實現基於上述部落格中的 修改而來。本文實現的反射機制,其實就是根據字串,構造乙個類物件 classinfo是記錄類名與其相應的工廠函式 dynbase是實現反射機制的公共基類,每個繼承它的子類需要在建構函式中傳遞其類名的字串給dynbase的建構函式 templateclass dynb...