Есть строка, которая может принимать разные значения,
можно ли вызвать функцию, имя которой, равно значению строки,
а если, допустим, такой функции нет, то ничего не произойдет
Что бы не использовать много раз if str = 'myfunc' then myfunc(a);
Ответ
как следует из комментариев, от того, что у вас используется классовая функция, ничего особо не меняется (при использовании 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;
Комментариев нет:
Отправить комментарий