如何使用泛型处理普通的动态数组?

时间:2014-05-03 17:24:56

标签: delphi generics

我知道如何操纵派生的通用类,如TList等。

然而,当我想操纵一个普通的动态数组时,我遇到了困难。

如何将以下代码翻译成使用泛型的版本?

//code A
function CloneArray(original: TArray_Of_TX): TArray_Of_TX;
var
  i: integer;
  copy: TX;
begin
  Result.SetLength(SizeOf(original));
  for i:= 0 to SizeOf(original) -1 do begin
    copy:= TX.Create;
    copy.assign(original[i]);
    Result[i]:= copy;
  end; {for i}
end;

如果我使用的是TList,则通用版本为:

//code B (works, but not on a plain dynamic array)
uses
  System.SysUtils, system.classes, Generics.Collections;

type
  TMyList<T: TPersistent, constructor > = class(TList<T>)
  public
    function CloneArray: TMyList<T>;
  end;

implementation

function TMyList<T>.CloneArray: TMyList<T>;
var
  i: integer;
  temp: T;
begin
  Result:= TMyList<T>.Create;
  for i:= 0 to SizeOf(self) -1 do begin
    temp:= T.Create;
    temp.assign(self.items[i]);
    Result.Add(temp);
  end; {for i}
end;

但是,该代码不适用于TArray<T>,因为您无法访问其Items属性,但它没有。如果您使用array of ...我不知道如何使用泛型。

如何编写上述代码A的常规/泛型版本?

另见我的回答:https://stackoverflow.com/a/23446648/650492 我的答案在这里:https://stackoverflow.com/a/23447527/650492

1 个答案:

答案 0 :(得分:8)

type
  TArray = class
    class function Clone<T: TPersistent, constructor>(const original: array of T): TArray<T>; static;
  end;

function TArray.Clone<T>(const original: array of T): TArray<T>;
var
  i: integer;
  copy: T;
begin
  SetLength(Result, Length(original));
  for i := 0 to Length(original) - 1 do 
  begin
    copy := T.Create;
    copy.Assign(original[i]);
    Result[i] := copy;
  end;
end;