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;

コメント