Delphi の interface のプロパティを RTTI で取得
Delphi の interface のプロパティを RTTI で取得
インタフェイスから直接取り出せないため、元のクラスにキャストして取得
キャスト可能なのは Delphi2010以降だそうです
- uses System.Rtti;
- type
- ITest = interface
- function GetValue: string;
- procedure SetValue(const Value: string);
- property Value: string read GetValue write SetValue;
- end;
- TTest = class(TInterfacedObject, ITest)
- private
- FValue: string;
- function GetValue: string;
- procedure SetValue(const Value: string);
- public
- property Value: string read GetValue write SetValue;
- end;
- // :::::
- procedure TForm1.Button1Click(Sender: TObject);
- var
- Test: ITest;
- TestObj: TTest;
- RttiContext: TRttiContext;
- RttiType: TRttiType;
- RttiProp: TRttiProperty;
- begin
- Test := TTest.Create;
- Test.Value := 'interface rtti';
- // 元のクラスにキャスト
- TestObj := TTest(Test);
- RttiContext := TRttiContext.Create;
- try
- RttiType := RttiContext.GetType(TestObj.ClassInfo);
- for RttiProp in RttiType.GetProperties do begin
- Memo1.Lines.Add('Name: ' + RttiProp.Name);
- Memo1.Lines.Add('Type: ' + RttiProp.PropertyType.ToString);
- if SameText(RttiProp.PropertyType.ToString, 'string') then begin
- Memo1.Lines.Add('Value: ' + RttiProp.GetValue(TestObj).AsString);
- end
- else if SameText(RttiProp.PropertyType.ToString, 'integer') then begin
- Memo1.Lines.Add('Value: ' + IntToStr(RttiProp.GetValue(TestObj).AsInteger));
- end;
- end;
- finally
- RttiContext.Free;
- end;
- end;
コメント