GetMethods、GetMethodInfo、CreateMethodPointer、ReleaseMethodPointer、ObjectInvoke
通过 GetMethods、GetMethodInfo 可以获取类公用成员的详细信息.
通过 TypInfo 只能获取 published 区中成员的信息( 例子);
通过 ObjAuto 也能获取 public 区的成员信息.
本例效果图:

本例有两个单元, 辅助单元(Unit2)里存放了 3 个用于测试的类:
unit Unit2;
interface
type
//TClass1 没有指定额外的编译指令, ObjAuto 只能获取其 published 区的方法
TClass1 = class
function Fun1: string;
private
function Fun1Private: string;
protected
function Fun1Protected: string;
public
function Fun1Public: string;
published
function Fun1Published: string;
end;
//TClass2 指定了 {$M+}, ObjAuto 能获取其 published 区和默认区域的方法.
//一般情况下, 默认区域的成员相当于在 public 区;
//指定了 {$M+} 以后, 默认区域的成员相当于在 published 区.
//因为 TPersistent(这是很多类的祖先) 已经指定了 {$M+}, 所以大多类的都是 {$M+} 打开的.
{$M+}
TClass2 = class
function Fun2: string; {默认区域}
private
function Fun2Private: string;
protected
function Fun2Protected: string;
public
function Fun2Public: string;
published
function Fun2Published: string;
end;
{$M-}
//编译指令 Methodinfo 是 Delphi 2009 新增的, 只有它打开了, ObjAuto 才可以获取 public 区的信息.
//这样, ObjAuto 可以获取 TClass3 的 public、published 和默认区域的信息.
{$M+}
{$METHODINFO ON}
TClass3 = class
function Fun3: string;
private
function Fun3Private: string;
protected
function Fun3Protected: string;
public
function Fun3Public: string;
published
function Fun3Published: string;
end;
{$METHODINFO OFF}
{$M-}
implementation
{ TClass1 -------------------------------------------------}
function TClass1.Fun1: string;
begin
Result := 'Fun1';
end;
function TClass1.Fun1Private: string;
begin
Result := 'Fun1Private';
end;
function TClass1.Fun1Protected: string;
begin
Result := 'Fun1Protected';
end;
function TClass1.Fun1Public: string;
begin
Result := 'Fun1Public';
end;
function TClass1.Fun1Published: string;
begin
Result := 'Fun1Published';
end;
{ TClass2 -------------------------------------------------}
function TClass2.Fun2: string;
begin
Result := 'Fun2';
end;
function TClass2.Fun2Private: string;
begin
Result := 'Fun2Private';
end;
function TClass2.Fun2Protected: string;
begin
Result := 'Fun2Protected';
end;
function TClass2.Fun2Public: string;
begin
Result := 'Fun2Public';
end;
function TClass2.Fun2Published: string;
begin
Result := 'Fun2Published';
end;
{ TClass3 -------------------------------------------------}
function TClass3.Fun3: string;
begin
Result := 'Fun3';
end;
function TClass3.Fun3Private: string;
begin
Result := 'Fun3Private';
end;
function TClass3.Fun3Protected: string;
begin
Result := 'Fun3Protected';
end;
function TClass3.Fun3Public: string;
begin
Result := 'Fun3Public';
end;
function TClass3.Fun3Published: string;
begin
Result := 'Fun3Published';
end;
end.
主单元(Unit1):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ObjAuto, Unit2;
{获取 Unit2.TClass1 的信息}
procedure TForm1.Button1Click(Sender: TObject);
var
MiArr: TMethodInfoArray;
Mi: PMethodInfoHeader;
obj: TClass1;
begin
obj := TClass1.Create;
MiArr := GetMethods(obj.ClassType);
ListBox1.Clear;
for Mi in MiArr do
ListBox1.Items.Add(string(Mi.Name));
obj.Free;
end;
{获取 Unit2.TClass2 的信息}
procedure TForm1.Button2Click(Sender: TObject);
var
MiArr: TMethodInfoArray;
Mi: PMethodInfoHeader;
obj: TClass2;
begin
obj := TClass2.Create;
MiArr := GetMethods(obj.ClassType);
ListBox1.Clear;
for Mi in MiArr do
ListBox1.Items.Add(string(Mi.Name));
obj.Free;
end;
{获取 Unit2.TClass3 的信息}
procedure TForm1.Button3Click(Sender: TObject);
var
MiArr: TMethodInfoArray;
Mi: PMethodInfoHeader;
obj: TClass3;
begin
obj := TClass3.Create;
MiArr := GetMethods(obj.ClassType);
ListBox1.Clear;
for Mi in MiArr do
ListBox1.Items.Add(string(Mi.Name));
obj.Free;
end;
end.
窗体文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 114
ClientWidth = 211
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 127
Top = 14
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object ListBox1: TListBox
Left = 0
Top = 0
Width = 121
Height = 114
Align = alLeft
ItemHeight = 13
TabOrder = 1
end
object Button2: TButton
Left = 127
Top = 45
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 2
OnClick = Button2Click
end
object Button3: TButton
Left = 127
Top = 76
Width = 75
Height = 25
Caption = 'Button3'
TabOrder = 3
OnClick = Button3Click
end
end