利用反射檢視類成員

2021-09-08 21:49:47 字數 4018 閱讀 1544

反射檢視類的成員資訊

利用c#的反射機制,可以檢視封裝的型別的基本資訊及元資料。本文中的示例則是利用反射機制來檢視類的成員資訊,包括字段,方法,建構函式。

下面先列舉示例中所用到的類

type :system.reflection 功能的根,也是訪問元資料的主要方式。使用type的成員獲取關於型別宣告的資訊,如建構函式、方法、字段、屬性 (property) 和類的事件,以及在其中部署該類的模組和程式集。(摘自msdn)

propertyinfo :發現屬性 (property) 的屬性 (attribute) 並提供對屬性 (property) 元資料的訪問。

parameterinfo:發現引數屬性 (attribute) 並提供對引數元資料的訪問。

constructorinfo :用於發現建構函式的屬性 (attribute) 及呼叫建構函式。通過對 constructorinfo 呼叫 invoke 來建立物件,其中constructorinfo 是由 type 物件的 getconstructors 或 getconstructor 方法返回的。

下面列出示例

被反射的類 human類

1

public

class

human212

set 13}

1415

public

intage

1618

set22}23

24public

bool

***25

27set 28}

2930

public

human()

3132

33public human(string iname, int iage, bool

i***)

3439

40public

void

introduce()

41 ,i'm .

", name, age);43}

4445

public

bool

guessmy***(*** i***)

4649 }

輔助的列舉

1

public

enum ***:int

2

main方法

static

void main(string

args)

: ;

", pi.attributes, pi.propertytype, pi.name, pi.getvalue(test, null

)); methodinfo methinfo = type.getmethods(bindingflags.public |bindingflags.instance);

constructorinfo consinfo=type.getconstructors();

console.writeline(

"----------建構函式------------");

foreach (constructorinfo ci in

consinfo)

(", ci.attributes, type.name);

parameterinfo pinfos =ci.getparameters();

string paramstring = string

.empty;

foreach (parameterinfo pi in

pinfos)

,", pi.attributes, pi.parametertype, pi.name);

}console.writeline(paramstring.trim(',

') + ");"

); }

console.writeline(

"---------------方法----------");

foreach (methodinfo mi in

methinfo)

(", mi.attributes, mi.returntype, mi.name);

parameterinfo pinfos =mi.getparameters();

string paramstring = string

.empty;

foreach (parameterinfo pi in

pinfos)

,", pi.attributes, pi.parametertype, pi.name);

}console.writeline(paramstring.trim(',

') + ");"

); }

console.readline();

}

執行結果:

-----------------欄位---------------

none system.string name :  ;

none system.int32 age : 0 ;

none system.boolean *** : false ;

----------建構函式------------

privatescope, public, hidebysig, specialname, rtspecialname human ();

privatescope, public, hidebysig, specialname, rtspecialname human (none system.string iname,none system.int32 iage,none system.boolean i***);

---------------方法----------

privatescope, public, hidebysig, specialname system.string get_name ();

privatescope, public, hidebysig, specialname system.void set_name (none system.string value);

privatescope, public, hidebysig, specialname system.int32 get_age ();

privatescope, public, hidebysig, specialname system.void set_age (none system.int32 value);

privatescope, public, hidebysig, specialname system.boolean get_*** ();

privatescope, public, hidebysig, specialname system.void set_*** (none system.boolean value);

privatescope, public, hidebysig system.void introduce ();

privatescope, public, hidebysig system.boolean guessmy*** (none client.*** i***)

;privatescope, public, virtual, hidebysig, vtablelayoutmask system.string tostring ();

privatescope, public, virtual, hidebysig, vtablelayoutmask system.boolean equals (none system.object obj);

privatescope, public, virtual, hidebysig, vtablelayoutmask system.int32 gethashcode ();

privatescope, public, hidebysig system.type gettype ();

利用反射動態呼叫類成員

使用反射動態呼叫類成員,需要type類的乙個方法 invokemember。對該方法的宣告如下 摘抄於msdn public object invokemember string name,bindingflags invokeattr,binder binder,object target,obj...

(C )利用反射動態呼叫類成員

使用反射動態呼叫類成員,需要 type 類的乙個方法 invokemember。對該方法的宣告如下 摘抄於msdn public object invokemember string name,bindingflags invokeattr,binder binder,object target,o...

C 利用反射動態呼叫類成員

使用反射動態呼叫類成員,需要 type 類的乙個方法 invokemember。對該方法的宣告如下 摘抄於msdn public object invokemember string name,bindingflags invokeattr,binder binder,object target,o...