想到重载和泛型:
type
TMyHelper = class
public
class procedure SetLength(var A: String; Len: Double); overload; static;
class procedure SetLength<T>(var A: TArray<T>; Len: Double); overload; static;
class procedure SetLength<T>(var A: TArray<TArray<T>>; Len1, Len2: Double); overload; static;
// as so on...
end;
class procedure TMyHelper.SetLength(var A: String; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength<T>(var A: TArray<T>; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength<T>(var A: TArray<TArray<T>>; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
// and so on...
var
s: string;
a1: TArray<Integer>;
a2: TArray<TArray<String>>;
begin
TMyHelper.SetLength(s, 10);
TMyHelper.SetLength<Integer>(a1, 10);
TMyHelper.SetLength<String>(a2, 5, 10);
end;
如果你使用的 Delphi 版本不支持泛型,你一般不能重载数组元素类型,但如果你使用的元素类型有限,你仍然可以重载数组,例如:
type
TInteger1DimArray = array of Integer;
TInteger2DimArray = array of TInteger1DimArray;
TString1DimArray = array of String;
TString2DimArray = array of TString1DimArray;
// and so on...
TMyHelper = class
public
class procedure SetLength(var A: String; Len: Double); overload; static;
class procedure SetLength(var A: TInteger1DimArray; Len: Double); overload; static;
class procedure SetLength(var A: TInteger2DimArray; Len1, Len2: Double); overload; static;
class procedure SetLength(var A: TString1DimArray; Len: Double); overload; static;
class procedure SetLength(var A: TString2DimArray; Len1, Len2: Double); overload; static;
// as so on...
end;
class procedure TMyHelper.SetLength(var A: String; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TInteger1DimArray; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TInteger2DimArray; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
class procedure TMyHelper.SetLength(var A: TString1DimArray; Len: Double);
var
iLen: Integer;
begin
iLen := ...; // round Len as needed...
System.SetLength(A, iLen);
end;
class procedure TMyHelper.SetLength(var A: TString2DimArray; Len1, Len2: Double);
var
iLen1, iLen2: Integer;
begin
iLen1 := ...; // round Len1 as needed...
iLen2 := ...; // round Len2 as needed...
System.SetLength(A, iLen1, iLen2);
end;
// and so on...
var
s: string;
a1: TInteger1DimArray;
a2: TString2DimArray;
begin
TMyHelper.SetLength(s, 10);
TMyHelper.SetLength(a1, 10);
TMyHelper.SetLength(a2, 5, 10);
end;
如您所见,为单个String 实现SetLength() 很容易,但为数组实现SetLength() 可能会变得相当复杂,具体取决于您使用的数组类型。此解决方案与您可以在不借助 RTTI 的情况下获取用户代码一样接近,因此您可以直接调用 RTL 的 DynArraySetLength() 函数。