Доброго времени суток, уважаемые жители королевства.
Втал жестко такой вопрос из области RTTI:
Необходимо определить тип published метода класса, для того, чтобы его корректно вызвать.
(Со свойствами все понятно - через PPropList[i].PropType, а вот с методами... То есть не со свойствами типа метод (событиями) tkMethod, а именно с методами)
например
type
TSimpleMethod = procedure of object;
TIntMethod = procedure(Value: integer) of object;
TMyClass = class(TPersistent)
publised
procedure Foo;
procedure Foo2(Value: integer);
end;
Теперь хочется программно определить имея TMyClass, что Foo относится к TSimpleMethod, а Foo2 - к TIntMethod;
Пишем:
procedure DoIt(AClass: TClass; MethodName: string);
// сюда передаем TMyClass и соотвественно 'Foo' или 'Foo2'
var
M: TMethod;
Simple: TSimpleMethod;
IntProc: TIntMethod;
begin
M.Code := AClass.MethodAddress(MethodName);
if ??????? then
begin
Simple := TSimpleMethod(M);
if Assigned(M) then
Simple; // вызываем метод Foo;
end
else
if ??????? then
begin
IntProc := TIntMethod(M);
if Assigned(IntProc) then
IntProc(5); // вызываем метод Foo2(5);
end;
end;
Вот и вопрос: что должно стоять на месте "??????" (не в смысле MethodName = 'Foo' конечно, а через какие-то тропы M.Code.)
Иными словами как удостовериться, что AClass.MethodAddress('Foo') совместим с TSimpleMethod, а AClass.MethodAddress('Foo2') совместим с TIntMethod.
У TMethod есть еще свойство Data: Pointer но я так и не смог разобраться, что в этом свойстве находится и как это использовать. Может быть тут какая-то собака порылась.
Не могли бы просветить?