Ho un problema.![]()
Il mio obiettivo è eseguire dei metodi presenti in una classe.
Mi spiego meglio.
Supponiamo di avere una form con solamente una TEdit e un TButton.
Nella TEdit inserisco il nome di un metodo presente in una qualsiasi classe ( per esempio il metodo GetControlsAlignment del TPanel ) e, alla pressione del bottone, eseguo il metodo.
Per eseguire il metodo uso l'Rtti in questo modo:
Il tutto funziona egregiamete, fino a quando non provo ad eseguire un metodo dichiarato private/protected.codice:function TMyLibClass.RttiMethodInvokeEx( const lsMethodName:string; loRttiType : TRttiType; loInstance: TObject; const laoArgs: array of TValue ): TValue; var lbFound : Boolean; loMethod : TRttiMethod; i : Integer; laoParams : TArray<TRttiParameter>; begin Result := nil; try loMethod := nil; lbFound := false; for loMethod in loRttiType.GetMethods do begin if SameText( UpperCase( loMethod.Name ), UpperCase( lsMethodName ) ) then begin laoParams := loMethod.GetParameters; if Length( laoArgs ) = Length( laoParams ) then begin lbFound := true; for i := 0 to Length( laoParams ) - 1 do begin if laoParams[i].ParamType.Handle <> laoArgs[i].TypeInfo then begin lbFound := false; break; end; end; end; if lbFound then begin break; end; end; end; if ( loMethod <> nil ) and ( lbFound ) then begin Result := loMethod.Invoke( loInstance, laoArgs ); end else begin raise Exception.CreateFmt( 'method %s not found', [lsMethodName] ); end; except end; end;
Se non ho capito male il problema è che con l'Rtti riesco a vedere solamente i metodi pubblici. Esatto?![]()
C'è un modo per accedere anche a quelli private/protected?