反射是乙個程式集發現及執行的過程,通過反射可以得到*.exe或*.dll等程式集內部的資訊。使用反射可以看到乙個程式集內部的介面、類、方法、字段、屬性、特性等等資訊。在system.reflection命名空間內包含多個反射常用的類,下面**列出了常用的幾個類。
型別
作用
assembly
通過此類可以載入操縱乙個程式集,並獲取程式集內部資訊
eventinfo
該類儲存給定的事件資訊
fieldinfo
該類儲存給定的字段資訊
methodinfo
該類儲存給定的方法資訊
memberinfo
該類是乙個基類,它定義了eventinfo、fieldinfo、methodinfo、propertyinfo的多個公用行為
module
該類可以使你能訪問多個程式集中的給定模組
parameterinfo
該類儲存給定的引數資訊
propertyinfo
該類儲存給定的屬性資訊
一、system.reflection.assembly類
通過assembly可以動態引導程式集,並檢視程式集的內部資訊,其中最常用的就是load()這個方法。
assembly assembly=assembly.load("myassembly");
利用assembly的object createinstance(string) 方法可以反射建立乙個物件,引數0為類名。
二、system.type類
type是最常用到的類,通過type可以得到乙個類的內部資訊,也可以通過它反射建立乙個物件。一般有三個常用的方法可得到type物件。
利用typeof() 得到type物件
type type=typeof(example);
利用system.object.gettype() 得到type物件
example example=new example();
type type=example.gettype();
利用system.type.gettype() 得到type物件
type type=type.gettype("myassembly.example",false,true);
注意引數0是類名,引數1表示若找不到對應類時是否丟擲異常,引數1表示類名是否區分大小寫
例子:
我們最常見的是利用反射與activator結合來建立物件。
assembly assembly= assembly.load("myassembly");
type type=assembly.gettype("example");
object obj=activator.createinstance(type);
三、反射方法
1.通過 system.reflection.methodinfo能查詢到類裡面的方法
**:
type type=typeof(example);
methodinfo listmethodinfo=type.getmethods();
foreach(methodinfo methodinfo in listmethodinfo)
cosole.writeline("method name is "+methodinfo.name);
2.我們也能通過反射方法執行類裡面的方法
**:
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代表沒有引數
四、反射屬性
1.通過 system.reflection.propertyinfo 能查詢到類裡面的屬性
常用的方法有getvalue(object,object) 獲取屬性值和 setvalue(object,object,object) 設定屬性值
**:
type type=typeof(example);
propertyinfo listpropertyinfo=type.getproperties();
foreach(propertyinfo propertyinfo in listpropertyinfo)
cosole.writeline("property name is "+ propertyinfo.name);
2.我們也可以通過以下方法設定或者獲取乙個物件的屬性值
**:
assembly assembly=assembly.load("myassembly");
type type=assembly.gettype("example");
object obj=activator.createinstance(type);
propertyinfo propertyinfo=obj.getproperty("name"); //獲取name屬性物件
var name=propertyinfo.getvalue(obj,null); //獲取name屬性的值
propertyinfo propertyinfo2=obj.getproperty("age"); //獲取age屬性物件
propertyinfo.setvalue(obj,34,null); //把age屬性設定為34
五、反射字段
通過 system.reflection.fieldinfo 能查詢到類裡面的字段
它包括有兩個常用方法setvalue(object ,object )和getvalue(object) 因為使用方法與反射屬性非常相似,在此不再多作介紹
(略)六、反射特性
通過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());
通過下面例子,可以獲取example類name屬性的所有特性
**:
public class example
[datamemberattribute]
publics string name
type type = typeof(example);
propertyinfo propertyinfo=type.getproperty("name"); //獲取example類的name屬性
foreach (object attribute in propertyinfo.getcustomattributes(false)) //遍歷name屬性的所有特性
console.writeline(「property attribute: "+attribute.tostring());
www.2cto.com
七、常用例項
雖然反射有很多奧妙之處,但要注意使用反射生成物件會耗費很多效能,所能必須了解反射的特性,在合適的地方使用。最常見例子就是利用單體模式與反射一併使用, 在bll呼叫dal的時候,通過乙個反射工廠生成dal例項
static factory()
private static object createinstance(string typename)
return dals["typename"];
}public static iexampledal createexampledal()
}class program}}
namespace project.idal
}namespace project.dal
..................................
..................................}}
c語言 《指標的奧妙》
近來,又有同學問我 關於指標的知識,回顧兩年的程式設計之路,不知不覺,我離c語言的道路方向也偏差了很多,其實我好久都沒有碰過c語言了。但是這次回顧,我又對指標有了新的認識。首先 指標他到底是個什麼東西呢?其實他並沒有多麼奇妙,他就是乙個普通的變數,不過他裡面放的是同型別的位址,哈哈,我還是舉個例子吧...
c 中的反射
反射 reflection 是.net中的重要機制,通過放射,可以在執行時獲得.net中每乙個型別 包括類 結構 委託 介面和列舉等 的成員,包括方法 屬性 事件,以及建構函式等。還可以獲得每個成員的名稱 限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件...
C 的反射機制
type type cassembly.assembly.gettype moduleclass object params new object 3 params 0 modulecode params 1 titlefront modulename params 2 e no igeneraht...