Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Можно ли в Delphi, вызвать функцию по имени, которое хранится в строке?

#delphi


Есть строка, которая может принимать разные значения, 

можно ли вызвать функцию, имя которой, равно значению строки,

а если, допустим, такой функции нет, то ничего не произойдет

Что бы не использовать много раз if str = 'myfunc' then myfunc(a);
    


Ответы

Ответ 1



как следует из комментариев, от того, что у вас используется классовая функция, ничего особо не меняется (при использовании RTTI для решения задачи) type TTest = class(TObject) public class function myFunc(x : integer): integer; end; class function TTest.myFunc(x: integer): integer; begin result := x*100; end; метод TRttiMethod.invoke() имеет несколько перегруженных вараинтов, и может принимать как экземпляр класса так и мета-класс (class of ..). function invokeClassFunction(cls: TClass; funcName: string; args: array of TValue): TValue; var ctx: TRttiContext; t: TRttiType; m: TRttiMethod; begin ctx := TRttiContext.Create(); try t := ctx.GetType(cls); m := t.GetMethod(funcName); if (m = nil) then raise Exception.Create('Method not found'); result := m.Invoke(cls, args); finally ctx.Free(); end; end; Поэтому при вызове вы просто указываете нужный класс: var r : TValue; try r := invokeClassFunction(TTest, 'myFunc', [1]); writeln('result: ', r.AsInteger); except on e: Exception do writeln('ничего не проиозошло'); end;

Комментариев нет:

Отправить комментарий