2
0
Эх сурвалжийг харах

[rttiUtils] added CreateInstance method overload

Exilon 5 жил өмнө
parent
commit
ad7a333d98
1 өөрчлөгдсөн 22 нэмэгдсэн , 1 устгасан
  1. 22 1
      Quick.RTTI.Utils.pas

+ 22 - 1
Quick.RTTI.Utils.pas

@@ -74,7 +74,8 @@ type
     class function GetPropertyValueEx(aInstance: TObject; const aPropertyName: string): TValue;
     {$IFNDEF FPC}
     class function FindClass(const aClassName: string): TClass;
-    class function CreateInstance<T>: T;
+    class function CreateInstance<T>: T; overload;
+    class function CreateInstance(aBaseClass : TClass): TObject; overload;
     {$ENDIF}
   end;
 
@@ -115,6 +116,26 @@ begin
   end;
 end;
 
+class function TRTTI.CreateInstance(aBaseClass : TClass): TObject;
+var
+  value: TValue;
+  rtype: TRttiType;
+  rmethod: TRttiMethod;
+  rinstype: TRttiInstanceType;
+begin
+  rtype := fCtx.GetType(aBaseClass);
+  for rmethod in rtype.GetMethods do
+  begin
+    if (rmethod.IsConstructor) and (Length(rmethod.GetParameters) = 0) then
+    begin
+      rinstype := rtype.AsInstance;
+      value := rmethod.Invoke(rinstype.MetaclassType,[]);
+      Result := value.AsType<TObject>;
+      Exit;
+    end;
+  end;
+end;
+
 class destructor TRTTI.Destroy;
 begin
   fCtx.Free;