Мне нужно определить, является ли TRttiMethod
функцией
до сих пор, я написал эту функцию
Function IsFunction(QualifiedName,MethodName:string):Boolean;
Var
ctx : TRttiContext;
lType : TRttiType;
lMethod : TRttiMethod;
Begin
result:=false;
ctx := TRttiContext.Create;
lType:=ctx.FindType(QualifiedName);
if Assigned(lType) then
begin
lMethod:=lType.GetMethod(MethodName);
if Assigned(lMethod) then
Result:=(lMethod.ReturnType<>nil); //in this line the exception is raised
end;
End;
, но эта функция завершается ошибкой с этим исключением Insufficient RTTI available to support this operation.
, когда я тестируюПосле
IsFunction('SysUtils.Exception','CreateFmt')
также происходит сбой с этими классами и методами
SysUtils.Exception -> CreateFmt
SysUtils.Exception -> CreateResFmt
SysUtils.Exception -> CreateResFmt
SysUtils.Exception -> CreateFmtHelp
SysUtils.Exception -> CreateResFmtHelp
SysUtils.Exception -> CreateResFmtHelp
SysUtils.TEncoding -> Convert
SysUtils.TEncoding -> Convert
SysUtils.TEncoding -> GetBufferEncoding
SysUtils.TEncoding -> GetBufferEncoding
SysUtils.TEncoding -> GetByteCount
SysUtils.TEncoding -> GetByteCount
SysUtils.TEncoding -> GetByteCount
SysUtils.TEncoding -> GetByteCount
SysUtils.TEncoding -> GetBytes
SysUtils.TEncoding -> GetBytes
SysUtils.TEncoding -> GetBytes
SysUtils.TEncoding -> GetBytes
SysUtils.TEncoding -> GetBytes
SysUtils.TEncoding -> GetCharCount
SysUtils.TEncoding -> GetCharCount
SysUtils.TEncoding -> GetChars
SysUtils.TEncoding -> GetChars
SysUtils.TEncoding -> GetChars
SysUtils.TEncoding -> GetPreamble
SysUtils.TEncoding -> GetString
SysUtils.TEncoding -> GetString
SysUtils.TMBCSEncoding -> GetPreamble
SysUtils.TUTF8Encoding -> GetPreamble
SysUtils.TUnicodeEncoding -> GetPreamble
SysUtils.TBigEndianUnicodeEncoding -> GetPreamble
Rtti.TRttiMethod -> Invoke
Rtti.TRttiMethod -> Invoke
Rtti.TRttiMethod -> Invoke
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> AddRange
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> AddRange
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> AddRange
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> InsertRange
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> InsertRange
Generics.Collections.TList<Rtti.TMethodImplementation.TParamLoc> -> InsertRange
Generics.Collections.TArray -> Sort
Generics.Collections.TArray -> Sort
Generics.Collections.TArray -> Sort
Generics.Collections.TArray -> BinarySearch
Generics.Collections.TArray -> BinarySearch
Generics.Collections.TArray -> BinarySearch
я написал это небольшое приложение, чтобы проверить это поведение
program ProjectTest;
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
Function IsFunction(QualifiedName,MethodName:string):Boolean;
Var
ctx : TRttiContext;
lType : TRttiType;
lMethod : TRttiMethod;
Begin
result:=false;
ctx := TRttiContext.Create;
lType:=ctx.FindType(QualifiedName);
if Assigned(lType) then
begin
lMethod:=lType.GetMethod(MethodName);
try
if Assigned(lMethod) then
Result:=(lMethod.ReturnType<>nil);
except on e : exception do
Writeln(Format('%s %s -> %s',[e.Message,QualifiedName,MethodName]));
end;
end;
End;
var
ctx : TRttiContext;
lType : TRttiType;
lMethod : TRttiMethod;
begin
try
ctx := TRttiContext.Create;
for lType in ctx.GetTypes do
for lMethod in lType.GetDeclaredMethods do
IsFunction(lType.QualifiedName,lMethod.Name);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
, что является правильным способомопределить, является ли TRttiMethod
функцией?
ОБНОВЛЕНИЕ
Благодаря предложениям @Barry я переписал функцию, чтобы избежать исключения, однако это не решаетпроблема того, как определить, является ли TRttiMethod
функцией или нет из-за текущих ограничений RTTI.
function IsFunction(lType : TRttiType;MethodName:string):Boolean;
Var
ctx : TRttiContext;
lMethod : TRttiMethod;
Begin
result:=false;
if Assigned(lType) then
begin
lMethod:=lType.GetMethod(MethodName);
if Assigned(lMethod) then
if lMethod.HasExtendedInfo then
Result:= (lMethod.MethodKind in [mkFunction,mkClassFunction]) //you can be 100 % sure, wich this is a function or not
else // sorry but the RTTI does not provide this information when the TRttiMethod contains parameters or an resultype that are not supported by the RTTI
Result:=False;
end;
End;