这几种写法基本上是等价的,只不过dynamic关键字不指定动态方法编号。 //-----------------------------------------Borland.Delphi.System.pas-- function GetMessageID(Obj: TObject): Integer; var Field: FieldInfo; begin Field := Obj.GetType.GetFields[0]; Result := Integer(Field.GetValue(Obj)); end; //-----------------------------------------Borland.Delphi.System.pas-- 对TObject.Dispatch而言,参数Message可变,但第一个字段必须是一个Integer, 指明此Message需要被Dispatch到哪个编号的动态方法。GetMessageID函数就负责 用Reflection从一个类型中获取消息编号。注意这里并没有做异常情况检测,意味着如果 传递无效的类型进来可能导致异常。 TObjectHelper.Dispatch代码主要是通过在MethodMaps中查表定位动态方法, 如果没有缓存就使用TMethodMap.Create构造类型与动态方法的映射关系,代码略过。