C 反射機制

2021-08-15 09:28:51 字數 3660 閱讀 9392

.net framework 中提供了反射機制,可以再引導程式執行時,動態獲取和引導程式集,並且可以獲取到程式集的資訊

在程式集中,包含模組(module),模組包含型別,型別包含成員,提供反射,我們可以檢視到乙個程式集的路徑,命名空間,類。我們還可以對其進行操作

可以對程式集的類進行例項化,掉用類中的方法等,就跟我們普通使用程式集一樣

反射機制通常有下面一些用途

關於反射,msdn上有很詳細的說明,這裡不詳細講,下面簡單說說反射的使用

1、為了演示,我們自定義乙個類庫,自定義乙個類

namespace

環環環環環

//建構函式

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()}}

2、新建乙個project,把上面編譯好的庫 環環環環環.dll 複製到debug目錄下

引導程式集

//

獲取程式集

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...