RTTI Dynamic array TValue Delphi 2010

后端 未结 1 1136
囚心锁ツ
囚心锁ツ 2020-12-15 13:49

I have a question. I am a newbie with Run Time Type Information from Delphi 2010. I need to set length to a dynamic array into a TValue. You can see the code.



        
相关标签:
1条回答
  • 2020-12-15 14:06

    TValue wasn't designed for arbitrary manipulation of its contents (it would have more helpers for e.g. setting record fields etc. if so), but rather for transporting values between concrete static types and dynamic RTTI. In this respect, TValue.SetArrayElement is an anomaly, and in hindsight, perhaps should not have been included. However, what you ask is possible:

    uses Rtti;
    
    type
      TMyArray = array of Integer;
      TMyClass = class
        function Go: TMyArray;
      end;
    
    function TMyClass.Go: TMyArray;
    var
      i: Integer;
    begin
      SetLength(Result, 5);
      for i := 0 to 4 do
        Result[i] := 3;
    end;
    
    procedure P;
    var
      ctx: TRttiContext;
      v: TValue;
      len: Longint;
      i: Integer;
    begin
      v := ctx.GetType(TMyClass).GetMethod('Go').Invoke(TMyClass.Create, []);
      Writeln(v.ToString);
      len := 10;
      DynArraySetLength(PPointer(v.GetReferenceToRawData)^, v.TypeInfo, 1, @len);
      Writeln(v.GetArrayLength);
      for i := 0 to v.GetArrayLength - 1 do
        Writeln(v.GetArrayElement(i).ToString);
    end;
    
    begin
      P;
    end.
    
    0 讨论(0)
提交回复
热议问题