一旦得到类对象,上表中所列的方法就能被叫来调用REFLACTION.第一个例子将检查在CSHARPREFLECTIONSAMPLES.REFLECT类中的得到方法的信息。第一块代码用来定义类中的每个方法的名字,第二块代码将阐述得到方法信息。向下面所展示的,我们将用一个数组来保存用GETMETHOD()方法返回的方法信息。METHODINFO类包含信息为方法的名字,不管是否是虚拟的,它都是可见的,等等。
NAMESPACE CSHARPREFLECTIONSAMPLES { USING SYSTEM; USING SYSTEM.REFLECTION;
/// <SUMMARY> /// SUMMARY DESCRIPTION FOR CLIENT. /// </SUMMARY> PUBLIC CLASS CLIENT { PUBLIC STATIC VOID MAIN() { // THE TYPEOF OPERATOR AND THE GETTYPE METHOD // BOTH RETURN A 'TYPE' OBJECT. TYPE TYPE1 = TYPEOF(REFLECT); REFLECT OBJTEST = NEW REFLECT(0); TYPE TYPE2 = OBJTEST.GETTYPE();
CONSOLE.WRITELINE("TYPE OF OBJTEST IS {0}", TYPE2); CONSOLE.WRITELINE(); // PAUSE CONSOLE.READLINE();
// REFLECT METHOD INFORMATION METHODINFO[] MINFO = TYPE1.GETMETHODS(); // ITERATE THROUGH METHODS FOREACH (METHODINFO M IN MINFO) { CONSOLE.WRITELINE(M); } CONSOLE.WRITELINE(); } } }
下一个例子将展示动态得到对象有可能接触的每个构造器的信息。类似与上面的例子,我们将返回一个包含每个构造器的信息CONSTRUCTORINFO对象。
NAMESPACE CSHARPREFLECTIONSAMPLES { USING SYSTEM; USING SYSTEM.REFLECTION;
/// <SUMMARY> /// SUMMARY DESCRIPTION FOR CLIENT. /// </SUMMARY> PUBLIC CLASS CLIENT { PUBLIC STATIC VOID MAIN() { // THE TYPEOF OPERATOR AND THE GETTYPE METHOD // BOTH RETURN A 'TYPE' OBJECT. TYPE TYPE1 = TYPEOF(REFLECT); REFLECT OBJTEST = NEW REFLECT(0); TYPE TYPE2 = OBJTEST.GETTYPE();
CONSOLE.WRITELINE("TYPE OF OBJTEST IS {0}", TYPE2); CONSOLE.WRITELINE(); // PAUSE CONSOLE.READLINE();
// REFLECT CONSTRUCTORS CONSTRUCTORINFO[] CINFO = TYPE1.GETCONSTRUCTORS(); // ITERATE THROUGH CONSTRUCTORS FOREACH (CONSTRUCTORINFO C IN CINFO) { CONSOLE.WRITELINE(C); } } } }
最后一部分,也许是REFLECTION名字空间中最激动人心的部分,是在运行时动态调用类方法。有两种方法,首先,我们将建立一个数组来存储参数,这些参数被构造器用来建造对象。第二,一个SYSTEM.OBJECT对象将对抗CREATEINSTANCE方法的对象。以得到想得到对象的例子。最后,当我们有了对象的资料,我们能够调用任何使用METHODPARM数组的方法。下面是代码:
NAMESPACE CSHARPREFLECTIONSAMPLES { USING SYSTEM; USING SYSTEM.REFLECTION;
/// <SUMMARY> /// SUMMARY DESCRIPTION FOR CLIENT. /// </SUMMARY> PUBLIC CLASS CLIENT { PUBLIC STATIC VOID MAIN() { // THE TYPEOF OPERATOR AND THE GETTYPE METHOD // BOTH RETURN A 'TYPE' OBJECT. TYPE TYPE1 = TYPEOF(REFLECT); REFLECT OBJTEST = NEW REFLECT(0); TYPE TYPE2 = OBJTEST.GETTYPE();
// DYNAMIC CREATION AND INVOCATION // INSTANTIATE THE REFLECT OBJECT, PASSING // A VALUE OF 1 TO THE CONSTRUCTOR OBJECT[] OCONSTRUCTPARMS = NEW OBJECT[] {1}; OBJECT OBJ = ACTIVATOR.CREATEINSTANCE(TYPE1, OCONSTRUCTPARMS); // INVOKE METHOD OF REFLECT OBJECT OBJECT[] OMETHODPARMS = NEW OBJECT[] {17}; INT INTRESULT = (INT)TYPE1.INVOKEMEMBER("AMETHOD", BINDINGFLAGS.DEFAULT | BINDINGFLAGS.INVOKEMETHOD, NULL, OBJ, OMETHODPARMS); CONSOLE.WRITELINE("RESULT OF CALLING AMETHOD ON {0} IS {1}", TYPE1.NAME, INTRESULT); // PAUSE CONSOLE.READLINE(); } } }
这篇文章阐述了.NET REFLACTION的基础,在下一部分,我将和大家讨论进一步的话题,比如,动态发布中间语言,旗帜绑定,和中间语言原则。
|