.net framework 中提供了反射機制,可以再引導程式執行時,動態獲取和引導程式集,並且可以獲取到程式集的資訊
在程式集中,包含模組(module),模組包含型別,型別包含成員,提供反射,我們可以檢視到乙個程式集的路徑,命名空間,類。我們還可以對其進行操作
可以對程式集的類進行例項化,掉用類中的方法等,就跟我們普通使用程式集一樣
反射機制通常有下面一些用途
關於反射,msdn上有很詳細的說明,這裡不詳細講,下面簡單說說反射的使用
1、為了演示,我們自定義乙個類庫,自定義乙個類
namespace2、新建乙個project,把上面編譯好的庫 環環環環環.dll 複製到debug目錄下環環環環環
//建構函式
public
user()
public user(string
name)
//public函式
public
void
publicshow()
//private函式
private
void
privateshow()
//static函式
public
static
string
staticmethod()
//帶參帶返回值函式
public
string getstring(string
name)
//事件
public
event
eventhandler eventhandler;
//事件處理函式
public
void
doevent()}}
引導程式集
//獲取程式集
assembly assembly = assembly.load("
環環環環環");
assembly assembly2 = assembly.loadfrom("
環環環環環.dll");
//從程式集中獲取指定物件型別;
type type = assembly.gettype("
環環環環環.user");
//使用activator建立例項(無引數建構函式)
var user1 =activator.createinstance(type);
//使用activator建立例項(帶引數建構函式)
var user2 = activator.createinstance(type, "薄暮"
);
//使用assembly建立例項(無引數建構函式)
var user3 = assembly.createinstance("
環環環環環.user");
//反射無參建構函式
constructorinfo constructor1 = type.getconstructor(new
type {});
var user4 = constructor1.invoke(new
object
);
//反射有參建構函式
constructorinfo constructor2 = type.getconstructor(new type );
var user5 = constructor2.invoke(new
object );
//呼叫public函式(無引數)
type.invokemember("
publicshow",
bindingflags.invokemethod | bindingflags.public | bindingflags.instance, null
, user1,
null
);
//呼叫public函式(帶引數)
string returnvalue =type.invokemember(
"getstring",
bindingflags.invokemethod | bindingflags.optionalparambinding, null
, user1,
newobject ) as
string
;
//呼叫靜態方法
string returnvalue2 =type.invokemember(
"staticmethod
", bindingflags.invokemethod | bindingflags.public |bindingflags.static,
null, null, new
object {}) as
string
;
//呼叫私有方法 .
type.invokemember("
privateshow",
bindingflags.invokemethod | bindingflags.nonpublic | bindingflags.instance, null
, user1,
newobject
{});
//反射屬性
var name =type.invokemember(
"name
", bindingflags.getproperty | bindingflags.public | bindingflags.instance, null
, user1,
newobject {}) as
string
;
//設定屬性(設定name屬性為"新屬性")
type.invokemember("
name
", bindingflags.setproperty | bindingflags.public | bindingflags.instance, null
, user1,
newobject );
//反射字段
string field =type.invokemember(
"field
", bindingflags.getfield | bindingflags.public | bindingflags.instance, null
, user1,
newobject {}) as
string
;
//設定字段(設定field欄位為"新字段")
type.invokemember("
field
", bindingflags.setfield | bindingflags.public | bindingflags.instance, null
, user1,
newobject );
C 反射機制
反射的概述 反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等。system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 syste...
C 反射機制
反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等。system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 system.refl...
C 反射機制
參考 本文的實現基於上述部落格中的 修改而來。本文實現的反射機制,其實就是根據字串,構造乙個類物件 classinfo是記錄類名與其相應的工廠函式 dynbase是實現反射機制的公共基類,每個繼承它的子類需要在建構函式中傳遞其類名的字串給dynbase的建構函式 templateclass dynb...