用于存储枚举的列表类



我应该使用什么List类型来存储enum值?我已经尝试了TObjectList,我转换到TObject来添加值,但不能从列表中读取时将其转换回enum。

你用什么列表来存储枚举?

将枚举转换为PointerTObject并返回正常工作。如果您的Delphi版本支持泛型,请使用Tim的建议,那就更好了。或者,你可以使用一个动态数组(array of TTestEnum),或者在动态数组周围创建一个包装类——这就是泛型列表在Delphi版本中实现的方式。

这里是一个快速的控制台演示,使用TList,而不是TObjectList,因为TList对它保存的项目做了更少的假设。

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type TTestEnum = (enum1, enum2, enum3, enum4);
var L: TList;
    i: Integer;
    E: TTestEnum;
begin
  L := TList.Create;
  try
    L.Add(Pointer(enum1));
    L.Add(Pointer(enum2));
    L.Add(Pointer(enum3));
    L.Add(Pointer(enum4));
    for i:=0 to L.Count-1 do
    begin
      E := TTestEnum(L[i]);
      case E of
        enum1: WriteLn('enum1');
        enum2: WriteLn('enum2');
        enum3: WriteLn('enum3');
        enum4: WriteLn('enum4');
      end;
    end;
  finally L.Free;
  end;
  ReadLn;
end.

你能不能只使用泛型?

TList<TEnumName>;

这个答案可能有帮助。它是关于通过创建后代来将记录存储在TList中,以避免所有类型转换。请注意,您不需要担心为枚举值分配/释放内存,因为它们是简单的序数类型,可以放在指针的空间中。

注意,当Add转换到列表时,您必须类型转换为Pointer,并且在回读时可能必须类型转换为' YourEnum(Integer(list [Index]))。但是,我所链接的代码显示了如何在后代类中处理这两种方法,因此每种方法只执行一次,并且隐藏在类实现中。

相关内容

  • 没有找到相关文章

最新更新