Như chúng ta đều biết, khi chúng ta gọi một constructor của một lớp như thế này:Làm thế nào để tạo một thể hiện đối tượng với RTTI trong Delphi 2010?
instance := TSomeClass.Create;
Trình biên dịch Delphi thực sự làm những điều sau đây:
- Gọi newInstance tĩnh phương pháp để cấp phát bộ nhớ và khởi tạo bố cục bộ nhớ.
- Gọi phương thức khởi tạo để thực hiện khởi tạo của lớp
- Gọi phương pháp AfterConstruction
Rất đơn giản và dễ hiểu. nhưng tôi không chắc chắn cách trình biên dịch xử lý các ngoại lệ trong bước thứ hai và thứ ba.
Dường như không có cách nào rõ ràng để tạo một cá thể bằng cách sử dụng phương thức hàm tạo RTTI trong D2010. vì vậy tôi đã viết một hàm đơn giản trong khung công tác Spring cho Delphi để tạo lại quá trình tạo ra.
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;
Tôi cảm thấy nó có thể không đúng 100%. vì vậy xin vui lòng chỉ cho tôi cách. Cảm ơn!
Cảm ơn bạn rất nhiều! Cuối cùng tôi đã có lý do tại sao có một quá tải của Invoke với một tham số lớp. –
@Paul: Quá tải đó cũng có thể được sử dụng để gọi các phương thức ** lớp **. –
Vâng. Nhưng tôi đã nhầm lẫn với tên của tham số. (Ví dụ: TClass ...) –