Come tutti conosciuti, quando chiamiamo un costruttore di una classe come questa:Come creare un'istanza di oggetto con RTTI in Delphi 2010?
instance := TSomeClass.Create;
Il compilatore Delphi effettivamente fare le seguenti cose:
- Chiamare il NewInstance metodo statico per allocare la memoria e inizializza il layout di memoria.
- Chiamare il metodo di costruzione per eseguire l'inizializzazione della classe
- chiamata al metodo AfterConstruction
E 'semplice e facile da capire. ma non sono molto sicuro di come il compilatore gestisca le eccezioni nel secondo e nel terzo passo.
Sembra che non ci sia un modo esplicito per creare un'istanza utilizzando un metodo di costruzione RTTI in D2010. così ho scritto una semplice funzione in Spring Framework per Delphi per riprodurre il processo della creazione.
class function TActivator.CreateInstance(instanceType: TRttiInstanceType;
constructorMethod: TRttiMethod; const arguments: array of TValue): TObject;
var
classType: TClass;
begin
TArgument.CheckNotNull(instanceType, 'instanceType');
TArgument.CheckNotNull(constructorMethod, 'constructorMethod');
classType := instanceType.MetaclassType;
Result := classType.NewInstance;
try
constructorMethod.Invoke(Result, arguments);
except
on Exception do
begin
if Result is TInterfacedObject then
begin
Dec(TInterfacedObjectHack(Result).FRefCount);
end;
Result.Free;
raise;
end;
end;
try
Result.AfterConstruction;
except
on Exception do
begin
Result.Free;
raise;
end;
end;
end;
Mi sembra che non sia al 100% giusto. quindi per favore mostrami la via Grazie!
Grazie mille! Ho finalmente capito perché c'è un sovraccarico di Invoke con un parametro di classe. –
@Paul: questo sovraccarico può anche essere usato per chiamare i metodi ** class **. –
Sì. Ma ero confuso dal nome del parametro. (Istanza: TClass ...) –