泛型,遍历动态数组



我正在尝试迭代传递到泛型函数中的动态数组

我正在使用 TValue 来实现这一点,但我无法获得数组的长度,并且在那里我无法获取元素。

我写了一个小的演示项目来说明我的问题:

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.TypInfo, System.Rtti;
type
TMyEnum = (me_One, me_Two, me_Three);
Writer = class
public
class procedure Write<T>(Value: T);
end;
{ Writer }
class procedure Writer.Write<T>(Value: T);
var
ArrayValue: TValue;
TypeInfo: pTypeInfo;
begin
TypeInfo := System.TypeInfo(T);
if TypeInfo.Kind <> tkDynArray then
exit;
TValue.Make(nil, TypeInfo, ArrayValue);
Writeln(ArrayValue.GetArrayLength);
//Here I have my problem ArrayValue.GetArrayLength returns 0 and not 2 
end;
var
Enums: array of TMyEnum;
Dummy : String;
begin
try
SetLength(Enums, 2);
Enums[0] := me_One;
Enums[1] := me_Two;
Writer.Write(Enums);
Readln(Dummy);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

我自己找到了答案。 我使用TValue.Make而不是TValue.From的问题

这就可以了。与我开始的地方相比,要简单得多。

class function Writer.WriteLine<T>(AValue: T): string;
var
ElementValue, Value: TValue;
i: Integer;
begin
Value := TValue.From(AValue);
try
if not Value.IsArray then
Exit('');
if Value.GetArrayLength = 0 then
Exit('[]');
Result := '[';
for i := 0 to Value.GetArrayLength - 1 do
begin
ElementValue := Value.GetArrayElement(i);
Result := Result + ElementValue.ToString + ',';
end;
Result[Length(Result)] := ']';
finally
Writeln(Result);
end;
end;

最新更新