将枚举与泛型一起使用

2023-11-26

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

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)

Edit:

如果您想返回iterValue对于枚举,您可以使用以下函数,取自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;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将枚举与泛型一起使用 的相关文章

随机推荐

  • spoj ARRAYSUB:O(n) 复杂度方法

    我试图在 spoj 上解决这个问题http spoj pl problems ARRAYSUB 我用两种方法解决了这个问题 首先使用优化的蛮力 其次在 k 2k 3k 等处进行枢轴并找到最大值 尽管这两种解决方案在最坏情况下都被接受 但复杂
  • 订阅 Meteor.Users 集合

    in server js Meteor publish directory function return Meteor users find fields emails 1 profile 1 in client js Meteor su
  • 强制对象评估为 false

    我猜这可能是特定于应用程序的 但我使用的是node js 只要它在v8引擎中工作 我不介意 我正在尝试创建一个Object评估结果为 false 例如 var Foo function return this var bar new Foo
  • java file.renameTo() 确实重命名文件但返回 false。为什么?

    问题是我需要在其余逻辑工作之前移动文件 因此当该方法返回 false 时我停止执行 但是 当我在 Windows 资源管理器中检查该文件时 它有一个新名称并且已移动 只是好奇为什么会发生这种情况 这是我刚刚尝试重现问题的一些示例代码 这几乎
  • iOS 10 中收不到推送通知

    我的应用程序在 Appstore 中 推送通知在 iOS 9 中工作正常 但在 iOS 10 中不起作用 我没有收到任何 iOS 10 设备的推送通知 我已检查服务器中的设备令牌和证书 全部正确 我还检查了设置应用程序中的通知属性 一切都很
  • 释放鼠标捕获并让鼠标点击通过

    我有一个类似于弹出窗口或菜单的控件 我想显示它 当用户单击框的边界之外时 让它隐藏自己 我使用了 Mouse Capture this CaptureMode SubTree 并以与 OnLostMouseCapture 中的 Menu P
  • google.colab 模块中是否有一个函数可以关闭运行时

    有时 当我在 google colab 中运行时 当运行完成时 我无法留在计算机前手动断开与服务器的连接 即使我的运行已完成 无缘无故占用节点 连接仍保持打开状态 google colab 中是否有一个函数 可以让我插入该函数以在一些纪元后
  • Tensorflow如何恢复具有不同名称但相同形状的权重?

    我在 Tensorflow 中有多种架构 其中一些共享某些部件的设计 我想训练其中一个网络 并在另一个网络中使用相似层的训练权重 此时 我可以保存所需的权重 并将它们重新加载到具有完全相同的变量命名约定的架构中 然而 当两个网络中的权重名称
  • Swing Worker:函数 get()

    我的问题是我不明白如何swingworker有效 因为我想做的是fa worker get 因为我有一个很长的方法 可以计算在后台运行的很多点 因为我不想冻结我的界面 并且我想得到她的结果来绘制组件图像 但我不明白当我这样做时它会去哪里fa
  • 如何检测 html 元素是否可以追加子节点?

    我在我的应用程序中创建了一个名为 loading 的自定义 jquery 事件 当触发此事件时 我想附加一个带有微调器的屏蔽元素 我可以毫无问题地弄清楚那部分 但是 某些元素 图像 表单输入等 无法附加子元素 我需要能够检测此事件的目标是否
  • Android 片段 - findViewById 返回 null [重复]

    这个问题在这里已经有答案了 我有一个在互联网上似乎很常见的问题 我创建了一个仅包含片段的活动 这是生成的代码 Override protected void onCreate Bundle savedInstanceState super
  • Pandas 数据框列值不区分大小写替换 where

    pandas DataFrame replace 是否有不区分大小写的版本 https pandas pydata org pandas docs version 0 21 generated pandas DataFrame replac
  • 用条件列绘制 pandas DataFrame

    我有这种 pandas DataFrame a b 是获取 x 和 y 时的条件 df pd DataFrame 10 20 0 1 10 20 1 5 100 200 0 33 100 200 1 11 columns a b x y d
  • 如何使用 Liquibase 创建数据库

    我正在尝试使用Liquibase创建数据库not exists 我已经下载了MySQL并且没有对其进行任何更改 我的 Maven 插件代码看起来像
  • 将套接字对象发送到分叉运行进程(multiprocessing.Queue)

    我正在学习使用 HTML5 WebSockets 作为学习的一部分 我正在用 Python 编写一个服务器 这样我就可以了解它们如何工作的细节 前几天我创建了一个效果很好的应用程序 但我想扩展它 以便它支持多个端点 每个端点都是一个不同的
  • MVC 3 + $.ajax - 响应似乎正在缓存部分视图的输出

    我一定是错过了什么 愚蠢的 但问题就在这里 我在事务控制器上有一个创建操作 Create cshtml 使用 jQuery 通过调用 ajax 将表单发布到服务器 调试显示一切都按预期到达服务器 我使用表单数据来更新记录 这也很好用 然后
  • 为什么比较和交换 (CAS) 算法是无锁同步的不错选择?

    CAS 属于读取 修改 写入 RMW 系列 这是一组允许您以原子方式执行复杂事务的算法 具体来说 维基百科说 CAS 用于实现信号量和互斥体等同步原语 以及更复杂的无锁和无等待算法 CAS 可以实现比原子读取 写入或获取并添加更多的算法 并
  • 为什么 gcc 或 clang 无法正确 @encode SIMD 向量类型?

    在摆弄向量类型和 ObjC 运行时时 我遇到了一个非常令人困惑的问题 据我所知 clang 或 GCC 都不会为任何 SIMD 向量类型提供 正确的 类型编码 import
  • ASP.NET MVC 4 中 Windows 身份验证和表单身份验证的混合

    我们有一个 ASP NET MVC 4 Intranet 应用程序 我们正在使用 Windows 身份验证 这方面工作正常 使用用户的凭据 我们可以从 Web 应用程序访问这些凭据 然而 我们真正想要的是某种混合模式 我们希望从浏览器获取用
  • 将枚举与泛型一起使用

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