.NET的REFLECTION (2)
你当前的位置:烁空 --> 技术文档全集
一旦得到类对象,上表中所列的方法就能被叫来调用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的基础,在下一部分,我将和大家讨论进一步的话题,比如,动态发布中间语言,旗帜绑定,和中间语言原则。