Просмотр исходного кода

rtl: TRttiClassRefType for tkClassRef, issue 38571, from henrique

mattias 4 лет назад
Родитель
Сommit
01992a59d5
1 измененных файлов с 40 добавлено и 1 удалено
  1. 40 1
      packages/rtl/rtti.pas

+ 40 - 1
packages/rtl/rtti.pas

@@ -342,6 +342,20 @@ type
     property RecordTypeInfo: TTypeInfoRecord read GetRecordTypeInfo;
   end;
 
+  { TRttiClassRefType }
+  TRttiClassRefType = class(TRttiType)
+  private
+    function GetClassRefTypeInfo: TTypeInfoClassRef;
+    function GetInstanceType: TRttiInstanceType;
+    function GetMetaclassType: TClass;
+  public
+    constructor Create(ATypeInfo: PTypeInfo);
+
+    property ClassRefTypeInfo: TTypeInfoClassRef read GetClassRefTypeInfo;
+    property InstanceType: TRttiInstanceType read GetInstanceType;
+    property MetaclassType: TClass read GetMetaclassType;
+  end;
+
   { TRttiOrdinalType }
 
   TRttiOrdinalType = class(TRttiType)
@@ -1089,6 +1103,31 @@ begin
   inherited Create(ATypeInfo);
 end;
 
+{ TRttiClassRefType }
+
+constructor TRttiClassRefType.Create(ATypeInfo: PTypeInfo);
+begin
+  if not (TTypeInfo(ATypeInfo) is TTypeInfoClassRef) then
+    raise EInvalidCast.Create('');
+
+  inherited Create(ATypeInfo);
+end;
+
+function TRttiClassRefType.GetClassRefTypeInfo: TTypeInfoClassRef;
+begin
+  Result := TTypeInfoClassRef(FTypeInfo);
+end;
+
+function TRttiClassRefType.GetInstanceType: TRttiInstanceType;
+begin
+  Result := GRttiContext.GetType(ClassRefTypeInfo.InstanceType) as TRttiInstanceType;
+end;
+
+function TRttiClassRefType.GetMetaclassType: TClass;
+begin
+  Result := InstanceType.MetaClassType;
+end;
+
 { TRTTIContext }
 
 class constructor TRTTIContext.Init;
@@ -1131,7 +1170,7 @@ var
     TRttiDynamicArrayType, // tkDynArray
     TRttiRecordType, // tkRecord
     TRttiInstanceType, // tkClass
-    TRttiType, // tkClassRef
+    TRttiClassRefType, // tkClassRef
     TRttiType, // tkPointer
     TRttiType, // tkJSValue
     TRttiType, // tkRefToProcVar