RTTI Динамический массив TValue Delphi 2010
У меня вопрос. Я новичок с информацией о типе среды выполнения из Delphi 2010. Мне нужно установить длину динамического массива в TValue. Вы можете увидеть код.
Type TMyArray = array of integer;
TMyClass = class
publihed
function Do:TMyArray;
end;
function TMyClass.Do:TMyArray;
begin
SetLength(Result,5);
for i:=0 to 4 Result[i]=3;
end;
.......
.......
......
y:TValue;
Param:array of TValue;
.........
y=Methods[i].Invoke(Obj,Param);//delphi give me a DynArray type kind, is working, Param works to any functions.
if Method[i].ReturnType.TypeKind = tkDynArray then//is working...
begin
I want to set length for y to 10000//i don't know how to write.
end;
Я не люблю коллекции дженериков.
1 ответ
Решение
TValue
не был предназначен для произвольных манипуляций с его содержимым (у него было бы больше помощников, например, для установки полей записи и т. д., если это так), а скорее для передачи значений между конкретными статическими типами и динамическими RTTI. В этом отношении, TValue.SetArrayElement
является аномалией, и задним числом, возможно, не должны были быть включены. Однако то, что вы спрашиваете, возможно:
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.