delphi - 泛型,迭代动态数组
问题描述
我正在尝试遍历传递给通用函数的动态数组
我正在使用 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;
推荐阅读
- heroku - 在 Heroku 上使用 Google 的 TextToSpeech API
- c++ - 在 64 位系统上在低地址分配内存的最可靠/可移植的方法是什么?
- javascript - 使用样式对象传递上下文时,上下文如何工作?
- python - 从 selenium get_attribute('href') 中删除 'mailto:'
- javascript - Vuejs:第三次按下按钮后,我需要将按钮重置回名字
- powerbi - 嵌入式 powerbi 报告未显示移动视图
- unity3d - 在 Unity Shaderlab 中,如何使用 lerp 和 deltaTime 为值设置动画
- linux - How to change the username displayed within terminal window on Linux Mint?
- django - 无法弄清楚如何使用通用 UpdateView 呈现 ModelForm
- excel - 为什么并行化代码不会写入 Excel 电子表格?