将枚举与泛型一起使用

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(使用前将#替换为@)

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

  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • TypeScript 中泛型的不安全隐式转换

    TypeScript 编译器tsc编译以下代码 即使使用 strict旗帜 然而 该代码包含一个基本错误 而在 Java 或 C 等语言中可以避免这种错误 interface IBox
  • Mockito.any() 通过泛型接口

    是否可以通过泛型传递接口的类型 界面 public interface AsyncCallback
  • 在接口中使用 Java 泛型来强制执行以实现类型作为参数的方法

    我有一个这样的界面 public interface DataObject public void copyFrom DataObject source 以及一个实现它的类 public class DataObjectImpl imple
  • 如何从 VCL.Graphics 获取所有已注册的文件格式...但 64 位

    在我的 32 位应用程序中 我使用FindRegisteredPictureFileFormats 单元由 Cosmin Prund 提供 https stackoverflow com a 14677532 505088 gt 如何从图形
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • 如何在运行时(Delphi/Windows)程序中添加代码?

    我正在Windows XP Delphi 7上工作 我需要在正在运行的程序中添加一些过程 或函数 并且我不想在完成后再次重新编译它 我只有一个具有 5 个功能的主机应用程序来发送不同类型的警报 但是还有其他新的警报类型 所以我必须执行新的功
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 如何检查注册表项是否存在

    我不知道我的错误在哪里 它总是跳到else分支 但是密钥存在 我检查了几次 var reg TRegistry begin with TRegistry Create do try RootKey HKEY CURRENT USER Ope
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • 枚举类型在打字稿中给出双数组

    我想从枚举数据类型创建一个下拉列表 但是当我尝试将枚举更改为具有名称和值的对象时 枚举数组返回枚举成员的两倍 使用函数这个帖子 https stackoverflow com questions 18111657 how does one
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 我可以避免使用泛型来避免急于解决特征实现的歧义吗?

    考虑以下 Rust 代码 use std collections HashMap use std hash Hash trait Foo
  • Delphi 将面板流传输至文件

    今天我有一个关于将表单的一部分流式传输到文件的问题 在此示例中 我使用 Tmemo 而不是文件来查看流 这是我的表格 表单右上角的面板有一些控件 如标签 编辑等 使用 保存面板 按钮将面板保存在 TStream 上 这里是代码 proced
  • 是否可以为枚举类枚举器添加别名?

    给定一个 C 11 枚举类 嵌套在几个长且丑陋的命名空间中 namespace long and ugly enum class colour red green blue 枚举值可以使用别名吗 使用 clang 3 5 可以执行以下操作
  • 任意通用列表的通配符

    我有一个类 MyClass 它不是通用的 包含任意 TList 并对其执行某些操作 我希望用通用 TList 替换 TList 但 MyClass 必须保持非通用 由于 Delphi 是不变的 这样的事情是行不通的 list1 TList
  • TStream.Position 与 TStream.Seek 比较

    要移动 TStream 类中的 当前字节 指针 我们可以使用属性 Position 例如 MyStream Position 0 或使用 Seek 方法 例如 MyStream Seek 0 soFromBeginning 问题是 哪一个更

随机推荐

  • 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