type
TMyClass = class
...
public
...
property P1: Integer Index 1 read GetInteger write SetInteger;
property P2: Integer Index 2 read GetInteger write SetInteger;
property P3: Integer Index 3 read GetInteger write SetInteger;
...
end;
Is it possible to get the index of class property? For example, something like
I := IndexOfProperty(TMyClass.P2);
To get a value of an object by index, call the Object. values() method to get an array of the object's values and use bracket notation to access the value at the specific index, e.g. Object. values(obj)[1] .
To find the index of an object in an array, by a specific property: Use the map() method to iterate over the array, returning only the value of the relevant property. Call the indexOf() method on the returned from map array. The indexOf method returns the index of the first occurrence of a value in an array.
To get the index of an item in a single line, use the FindIndex() and Contains() method. int index = myList. FindIndex(a => a.
To get an object's key by index, call the Object. keys() method to get an array of the objects keys and use bracket notation to access the key at the specific index, e.g. Object. keys(obj)[1] .
You can use the RTTI, to get the index of a property. depending of you Delphi version you can use GetPropInfo
method (only for published properties) or access such info via the TRttiInstanceProperty
class
Try this sample.
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils,
TypInfo;
type
TMyClass = class
private
function GetInteger(const Index: Integer): Integer;
procedure SetInteger(const Index, Value: Integer);
public
property P1: Integer Index 1 read GetInteger write SetInteger;
property P2: Integer Index 2 read GetInteger write SetInteger;
property P3: Integer Index 3 read GetInteger write SetInteger;
end;
{ TMyClass }
function TMyClass.GetInteger(const Index: Integer): Integer;
begin
end;
procedure TMyClass.SetInteger(const Index, Value: Integer);
begin
end;
var
LRttiInstanceProperty : TRttiInstanceProperty;
LRttiProperty : TRttiProperty;
Ctx: TRttiContext;
LPropInfo : PPropInfo;
begin
try
LPropInfo:= GetPropInfo(TMyClass, 'P1'); //only works for published properties.
if Assigned(LPropInfo) then
Writeln(Format('The index of the property %s is %d',[LPropInfo.Name, LPropInfo.Index]));
Ctx:= TRttiContext.Create;
try
LRttiProperty:= Ctx.GetType(TMyClass).GetProperty('P2');
if Assigned(LRttiProperty) and (LRttiProperty is TRttiInstanceProperty) then
begin
LRttiInstanceProperty := TRttiInstanceProperty(LRttiProperty);
Writeln(Format('The index of the property %s is %d',[LRttiProperty.Name, LRttiInstanceProperty.Index]));
end;
finally
Ctx.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With