C Assembly 反射初解

2021-10-02 06:11:47 字數 3265 閱讀 8068

反射是乙個程式集發現及執行的過程,通過反射可以得到 .exe和 .dll 等程式集內部資訊,使用反射可以看到程式集內部類,方法,介面,結構,屬性,特性等資訊。

命名空間類system.reflection內包含多個反射常用類。

舉個栗子:

assembly  通過此類可以載入操縱乙個程式集,並獲取程式集內部資訊

eventinfo 該類儲存給定事件資訊

fieldinfo 該類儲存給定字段資訊

methodinfo 該類儲存給定方法資訊

memberinfo該類是乙個基類,它定義了eventinfo、fieldinfo、methodinfo、propertyinfo的多個公用行為

module 該類可以使你能訪問多個程式集中的給定模組

parameterinfo 該類儲存給定的引數資訊 

propertyinfo 該類儲存給定的屬性資訊

通過assembly類可以動態引導程式集,並檢視程式集內部資訊,常用load();

舉個栗子:

assembly assembly = assembly.load("assemblytest");
利用assembly的object createinstance(string) 方法可以反射建立乙個物件,引數0為類名。

type是最常用的類,可以通過type得到乙個類的內部資訊,也可以通過反射建立乙個物件

type t = typeof(example);//	利用typeof();

//利用system.object.gettype() 得到type物件

example example=new example();

type type=example.gettype();

// 利用system.type.gettype() 得到type物件

//引數一:程式集限量名稱

//引數二:true 則引發異常(如果找不到型別);false 則返回null.specifyingfalse

//引數三:執行的搜尋不區分大小寫則為 true,為 typename 執行的搜尋區分大小寫則為 false。

type type=type.gettype("myassembly.example",false,true);

//最常見的是利用反射與activator結合來建立物件。

assembly assembly= assembly.load("myassembly");

type type=assembly.gettype("example");

object obj=activator.createinstance(type);

通過system.reflection.methodinfo查詢類的方法:

type type=typeof(example);    

methodinfo listmethodinfo=type.getmethods(); //獲取方法集

foreach(methodinfo methodinfo in listmethodinfo)

cosole.writeline("method name is "+methodinfo.name); //迴圈方法名

使用反射方法執行類裡的方法:

assembly assembly= assembly.load("myassembly");

type type=assembly.gettype("example");

object obj=activator.createinstance(type);

methodinfo methodinfo=type.getmethod("hello world"); //根據方法名獲取methodinfo物件

methodinfo.invoke(obj,null); //引數1型別為object,代表hello world方法的對應引數,輸入值為null代表沒有引數

通過system.reflection.propertyinfo查詢類的屬性

type type=typeof(example);

propertyinfo listpropertyinfo=type.getproperties(); //獲取屬性集

foreach(propertyinfo propertyinfo in listpropertyinfo)

cosole.writeline("property name is "+ propertyinfo.name); //迴圈屬性集

通過system.reflection.fieldinfo查詢到類裡面的字段

setvalue(object ,object )和getvalue(object) 因為使用方法與反射屬性非常相似

activatortest activatortest = new activatortest(); 

system.reflection.fieldinfo fieldinfo = activatortest.gettype().getfield("nn");

console.writeline(fieldinfo.name+":"+ fieldinfo.getvalue(activatortest));

fieldinfo.setvalue(activatortest, "123");

console.writeline(fieldinfo.getvalue(activatortest));

通過system.reflection.memberinfo的getcustomattributes(type,bool)就可反射出乙個類裡面的特性,以下例子可以反射出乙個類的所有特性

type type=typeof("example");   

object typeattributes=type.getcustomattributes(false); //獲取example類的特性

foreach(object attribute in typeattributes)

console.writeline("attributes description is "+attribute.tostring());

sdio架構初解

一.前言 sd卡的大名是耳熟能詳,但是sdio匯流排確是不為人解,不過說起他的近親spi就知道了。我們這裡主要是理解sdio匯流排,並不去理解spi匯流排。也許大家會畏懼其龐大的 其實我們並不需要詳細理解其具體的實現,我們需要理解其架構。二.主機 host 在linux2.6.28中,在sdhci ...

Rete演算法初解

rete匹配演算法是一種進行大量模式集合和大量物件集合間比較的高效方法,通過這種方法找出所有匹配各個模式的物件。rete演算法以犧牲記憶體換取高速的策略 rete演算法分為兩個部分 規則編譯 rule compilation 執行時執行 runtime execution 規則編譯 功能 如何在pr...

vuex初解教程

什麼是vuex?vuex是乙個專門為vue.js設計的集中式狀態管理架構。狀態?我把它理解為在data中的屬性需要共享給其他vue元件使用的部分,就叫做狀態。簡單的說就是data中需要共用的屬性。為什麼使用vuex?如果您不打算開發大型單頁應用,使用 vuex 可能是繁瑣冗餘的。確實是如此 如果您的...