反射檢視類的成員資訊
利用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 }
1main方法public
enum ***:int
2
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...