gpt4 book ai didi

delphi - 将枚举与泛型一起使用

转载 作者:行者123 更新时间:2023-12-03 15:09:20 24 4
gpt4 key购买 nike

我正在尝试创建一个通用类,我可以使用一组枚举来启动其中的值。例如:

constructor TManager<TEnum>.Create;
var
enum: TEnum;
enumObj: TMyObject;
begin
fMyObjectList:= TObjectDictionary<TEnum,TMyObject>.Create([doOwnsValues],10);
for enum:= Low(TEnum) to High(TEnum) do
begin
enumObj:= TMyObject.Create();
fMyObjectList.Add(enum, enumObj);
end;
end;

此外,后面的方法将通过枚举值获取对象,例如:

function TManager<TEnum>.Fetch(enum: TEnum): TMyObject;
begin
fMyObjectList.TryGetValue(enum, Result);
end;

但是,作为泛型参数传递,delphi 并不知道 TEnum 将是一个枚举。我可以以某种方式强制执行吗?

最佳答案

正如 David 提到的,您能做的最好的事情就是在运行时使用 RTTI。

    type  
TRttiHelp = record
class procedure EnumIter<TEnum {:enum}>; static;
end;

class procedure TRttiHelp.EnumIter<TEnum {:enum}>;
var
typeInf: PTypeInfo;
typeData: PTypeData;
iterValue: Integer;
begin
typeInf := PTypeInfo(TypeInfo(TEnum));
if typeInf^.Kind <> tkEnumeration then
raise EInvalidCast.CreateRes(@SInvalidCast);

typeData := GetTypeData(typeInf);
for iterValue := typeData.MinValue to typeData.MaxValue do
WhateverYouWish;
end;

虽然我不知道当您的枚举具有定义的值时代码的行为,例如

    (a=9, b=19, c=25)
<小时/>

编辑:

如果您想将 iterValue 返回到枚举,您可以使用以下函数,取自 enum helper class by Jim Ferguson

class function TRttiHelp.EnumValue<TEnum {:enum}>(const aValue: Integer): TEnum;
var
typeInf: PTypeInfo;
begin
typeInf := PTypeInfo(TypeInfo(TEnum));
if typeInf^.Kind <> tkEnumeration then
raise EInvalidCast.CreateRes(@SInvalidCast);

case GetTypeData(typeInf)^.OrdType of
otUByte, otSByte:
PByte(@Result)^ := aValue;
otUWord, otSWord:
PWord(@Result)^ := aValue;
otULong, otSLong:
PInteger(@Result)^ := aValue;
else
raise EInvalidCast.CreateRes(@SInvalidCast);
end;
end;

然后,您可以使用一般提供的作为构造函数中字典的索引。

关于delphi - 将枚举与泛型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com