使用Delphi XE在类中存储泛型数组

使用Delphi XE在类中存储泛型数组,delphi,generics,Delphi,Generics,使用下面的结构,我如何定义我的TAnimalCollection类来存储我的集合?调用SelectAll或SelectTop10将更新SelectedRecords。 删除private字段可以编译代码,但没有存储返回结果集的机制 TDog = class private FBreed: string; public property Breed: string read FBreed write FBreed; end; TCat = class pr

使用下面的结构,我如何定义我的TAnimalCollection类来存储我的集合?调用SelectAll或SelectTop10将更新SelectedRecords。 删除private字段可以编译代码,但没有存储返回结果集的机制

  TDog = class
  private
    FBreed: string;
  public
    property Breed: string read FBreed write FBreed;
  end;

  TCat = class
  private
    IsWild: string;
  public
    property IsWild: string read FIsWild write FIsWild;
  end;

  TMyArray<T> = array of T;

  TAnimalCollection = class
  private
    SelectedRecords: TMyArray<T>; // Generates: Undeclared Identifier: 'T'
  public
    function SelectAll<T>: TMyArray<T>;
    function SelectTop10<T>: TMyArray<T>; 
    // Other Methods
  end;
TDog=class
私有的
fbried:字符串;
公众的
属性类型:字符串读取FBreed写入FBreed;
结束;
TCat=类
私有的
IsWild:字符串;
公众的
属性IsWild:字符串读取FISWARD写入FISWARD;
结束;
TMyArray=T的数组;
TAnimalCollection=类
私有的
所选记录:TMyArray;//生成:未声明的标识符:“T”
公众的
功能选择全部:TMyArray;
功能选择TOP10:TMyArray;
//其他方法
结束;

首先,您不需要
TMyArray
;内置的
TArray
类型执行相同的操作

不过,编译器是正确的。在字段声明中,没有
T
。泛型参数需要在声明的左侧引入,然后才能在右侧使用如果Delphi支持通用字段,则声明如下:

SelectedRecords<T>: TArray<T>;
欢迎您声明“泛型数组”,但只能作为泛型类的字段或泛型方法的变量。如果可以声明一个独立的泛型数组,请尝试考虑何时确定数组元素的实际类型。如果不是在声明数组的时候,那么什么时候?对于类和方法,您可以在声明类的变量、实例化类或调用方法时指定类型参数。这些用途与它们的声明是分开的,并且每个用途都是不同的。声明变量时,必须使用与声明变量相同的方法-如果不重新编译程序,变量的类型将无法更改。

当获得正确的变量时,请不要忘记;-)
SelectedRecords: TArray<TObject>;
// or, more conventionally,
SelectedRecords: array of TObject;