#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;
Комментариев нет:
Отправить комментарий