rtl: added TRttiInstanceType, issue 38824, from Henrique Gottardi Werlang

This commit is contained in:
mattias 2021-04-30 09:22:05 +00:00
parent a3b1d0b22a
commit 37fe291187

View File

@ -281,6 +281,7 @@ type
TRttiStructuredType = class abstract(TRttiType)
private
FFields: TRttiFieldArray;
FMethods: TRttiMethodArray;
FProperties: TRttiPropertyArray;
protected
@ -291,8 +292,10 @@ type
destructor Destroy; override;
function GetDeclaredFields: TRttiFieldArray; override;
function GetDeclaredMethods: TRttiMethodArray; override;
function GetDeclaredProperties: TRttiPropertyArray; override;
function GetFields: TRttiFieldArray; override;
function GetMethod(const aName: String): TRttiMethod; override;
function GetMethods: TRttiMethodArray; override;
function GetMethods(const aName: String): TRttiMethodArray; override;
@ -306,8 +309,6 @@ type
TRttiInstanceType = class(TRttiStructuredType)
private
FFields: TRttiFieldArray;
function GetClassTypeInfo: TTypeInfoClass;
function GetMetaClassType: TClass;
protected
@ -315,9 +316,6 @@ type
public
constructor Create(ATypeInfo: PTypeInfo);
function GetFields: TRttiFieldArray; override;
function GetDeclaredFields: TRttiFieldArray; override;
property ClassTypeInfo: TTypeInfoClass read GetClassTypeInfo;
property MetaClassType: TClass read GetMetaClassType;
end;
@ -992,31 +990,7 @@ begin
Result := FMethods;
end;
{ TRttiInstanceType }
function TRttiInstanceType.GetClassTypeInfo: TTypeInfoClass;
begin
Result:=TTypeInfoClass(FTypeInfo);
end;
function TRttiInstanceType.GetMetaClassType: TClass;
begin
Result:=ClassTypeInfo.ClassType;
end;
function TRttiInstanceType.GetAncestor: TRttiStructuredType;
begin
Result := GRttiContext.GetType(ClassTypeInfo.Ancestor) as TRttiStructuredType;
end;
constructor TRttiInstanceType.Create(ATypeInfo: PTypeInfo);
begin
if not (TTypeInfo(ATypeInfo) is TTypeInfoClass) then
raise EInvalidCast.Create('');
inherited Create(ATypeInfo);
end;
function TRttiInstanceType.GetDeclaredFields: TRttiFieldArray;
function TRttiStructuredType.GetDeclaredFields: TRttiFieldArray;
var
A, FieldCount: Integer;
@ -1034,7 +1008,7 @@ begin
Result := FFields;
end;
function TRttiInstanceType.GetFields: TRttiFieldArray;
function TRttiStructuredType.GetFields: TRttiFieldArray;
var
A, Start: Integer;
@ -1060,6 +1034,30 @@ begin
end;
end;
{ TRttiInstanceType }
function TRttiInstanceType.GetClassTypeInfo: TTypeInfoClass;
begin
Result:=TTypeInfoClass(FTypeInfo);
end;
function TRttiInstanceType.GetMetaClassType: TClass;
begin
Result:=ClassTypeInfo.ClassType;
end;
function TRttiInstanceType.GetAncestor: TRttiStructuredType;
begin
Result := GRttiContext.GetType(ClassTypeInfo.Ancestor) as TRttiStructuredType;
end;
constructor TRttiInstanceType.Create(ATypeInfo: PTypeInfo);
begin
if not (TTypeInfo(ATypeInfo) is TTypeInfoClass) then
raise EInvalidCast.Create('');
inherited Create(ATypeInfo);
end;
{ TRttiInterfaceType }
constructor TRttiInterfaceType.Create(ATypeInfo: PTypeInfo);
@ -1291,7 +1289,7 @@ end;
function TRttiField.GetFieldType: TRttiType;
begin
Result := GRttiContext.GetType(FTypeInfo);
Result := GRttiContext.GetType(FieldTypeInfo.TypeInfo);
end;
function TRttiField.GetFieldTypeInfo: TTypeMemberField;