Delphi RTTI:获取属性的类

2024-03-07

使用Delphi 2010和RTTI,我知道如何获取对象的类类型以及如何获取/设置对象属性的值和类型,但是如何确定属性来自继承链中的哪个类?我想以不同于主类的方式使用基类的属性。

考虑这段代码:

TClassBase = class(TObject)
published
  property A: Integer;
end;

TClassDescendant = class(TClassBase)
published
  property B: Integer;
end;

procedure CheckProperties(Obj: TObject);
var
  ctx: TRttiContext;
  objType: TRttiType;
  Prop: TRttiProperty;
begin
  ctx := TRttiContext.Create;
  objType := ctx.GetType(Obj.ClassInfo);
  for Prop in objType.GetProperties do begin
    if Prop.GetClassType is TClassBase then
      // do something special with base class properties
    else
      // standard functionality on all other properties
  end;
end;

问题是没有属性的 GetClassType。 ClassType 仅返回 TRttiInstancePropertyEx,而不是属性所属类的名称。


另一种选择是使用Parent http://docwiki.embarcadero.com/Libraries/en/System.Rtti.TRttiMember.Parent的财产TRttiProperty http://docwiki.embarcadero.com/Libraries/en/System.Rtti.TRttiProperty,从这里您可以访问该属性所属的类。

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Rtti,
  SysUtils;

type
  TClassBase = class(TObject)
    private
      FA: Integer;
   published
    property A: Integer read FA;
  end;

  TClassDescendant = class(TClassBase)
    private
      FB: Integer;
    published
    property B: Integer read FB;
  end;

procedure CheckProperties(Obj: TObject);
var
  ctx: TRttiContext;
  objType: TRttiType;
  Prop: TRttiProperty;
begin
  ctx := TRttiContext.Create;
  objType := ctx.GetType(Obj.ClassInfo);
   for Prop in objType.GetProperties do
   if TRttiInstanceType(Prop.Parent).MetaclassType=TClassBase then
     Writeln(Format('The property %s is declarated in the TClassBase class',[Prop.Name]))
   else
     Writeln(Format('The property %s is not declarated in the TClassBase class',[Prop.Name]))
end;


begin
  try
   //CheckProperties(TClassBase.Create);
   CheckProperties(TClassDescendant.Create);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi RTTI:获取属性的类 的相关文章

  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • abc.abstractmethod + 属性

    根据docs http docs python org 3 3 whatsnew 3 3 html abc它应该能够结合起来 property and abc abstractmethod所以以下应该在 python3 3 中工作 impo
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • 加载 Jpg/Gif/Bitmap 并转换为 Bitmap

    我必须从 XML 文件加载图像 XML 文件中没有关于图像是否为 JPG GIF BMP 的信息 加载图像后 我需要将其转换为位图 有谁知道如何在不知道实际文件格式的情况下将图像转换为位图 我正在使用 Delphi 2007 2009 谢谢
  • Delphi线程死锁

    我有时会在销毁某些线程时遇到死锁问题 我尝试过调试该问题 但在 IDE 中调试时似乎从未存在死锁 可能是因为 IDE 中的事件速度较低 问题 当应用程序启动时 主线程会创建多个线程 线程始终处于活动状态并与主线程同步 完全没有问题 当应用程
  • delphi 变量值在循环中的线程中发生变化

    我的代码正在运行一个 for 循环来处理一些数据 如下所示 procedure printValue Value Integer begin TThread Synchronize TThread Current procedure beg
  • 如何避免使用 WinApi.Windows 的 Delphi 应用程序中的 dll 劫持

    Delphi 最新版本使用各种系统 dll 的静态链接 例如 WinApi Windows 单元中的 version dll 这会导致在单元初始化之前加载 version dll 这会打开一个安全漏洞 可以通过将受感染的 version d
  • 最终属性 @Value 中的 Spring 属性注入 - Java

    一个关于 Spring 从属性文件注入最终属性的简单问题 我有一个属性文件 我想在其中存储文件路径 通常 当我使用属性文件时 我使用如下内容设置类属性 private Value someProps prop field String so
  • 德尔福数据结构

    我可能需要在 Delphi 中做一个项目 并且是该领域的初学者 目前 我正在网上搜索资源 但由于资源站点太少而感到困惑 首先 你能给我一些好的网站 其中包含我迄今为止错过的 Delphi 资源吗 我也在 Delphi 中搜索数据结构 想知道
  • 如何仅使用 TADOQuery 组件将图像插入数据库

    我有一个简单的基本问题 我正在尝试使用将图像插入数据库Insert与其他列值的语句也使用TADOQuery成分 由于代码已经由某人编写 因此我想在此处放置一些虚拟示例代码 以供您澄清相应的步骤 请注意 这可以正常工作TQuery组件 因为我
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 以编程方式重新启动 Delphi 应用程序

    应该不可能运行我的应用程序的多个实例 因此项目源码包含 CreateMutex nil False PChar ID if GetLastError ERROR ALREADY EXISTS then Halt 现在我想以编程方式重新启动我
  • 从函数体内访问函数对象的属性

    JavaScript 中的函数也是一个对象 并且可以具有属性 那么有没有办法从它自己的函数体内部访问它的属性呢 像这样 var f function console log some way to access f a f a Test f
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack

随机推荐

  • Visibility.Collapsed 和 Visibility.Hidden 之间的区别

    之间有什么区别Visibility Collapsed and Visibility Hidden in WPF 不同之处在于Visibility Hidden隐藏控件 但保留它在布局中占用的空间 因此它渲染空白而不是控件 Visibilt
  • 判断Java中的网络掩码是否有效

    Java 6 中确定给定地址是否为有效网络掩码的最简单方法是什么 我找到了一个解决方案 它基本上创建了一组有效的IP以用于比较 即 255 255 255 255 255 255 255 254 255 255 255 252 等 有更简单
  • 无会话 CSRF 保护(双重提交 cookie)

    从我的讲座开始owasp org https www owasp org index php Cross Site Request Forgery 28CSRF 29 Prevention Cheat Sheet他们推荐同步器令牌模式 并且
  • Windows 8 将应用程序存储为企业软件

    我正在编写一个 Windows 8 应用商店应用程序 但该应用程序供我公司内部使用 该应用程序需要在 100 多台平板电脑上运行 因此安装过程必须简单 因此 我一直在使用 Windows 8 应用商店模板来创建我的应用程序 但现在我需要在我
  • 在 WPF 中将 DataSet 绑定到 DataGrid

    我知道这个问题之前已经被问过好几次了 但我无法得到这个 我有一个DataSet and a DataGrid 我想做的就是显示内容DataSet in the DataGrid 我写了这段代码 vConn new OleDbConnecti
  • 如何配置Intellij Idea live模板的适用上下文?

    我想为我的自定义文件类型创建一个实时模板组 但是当我选择适用的上下文时 除了我的自定义文件类型之外 还有一个文件类型或语言类型的列表 该列表是预定义的并且不能扩展吗 可用的上下文类型取决于启用的插件 Jetbrains 帮助页面中是这么说的
  • MapViewOfFile 失败,错误代码 6(无效句柄)

    我尝试将文件映射到内存并使用 MapViewOfFile 但它失败并显示错误代码 6 我尝试了几乎所有方法 我还读到大文件是问题所在 但问题也发生在 1kb 文件上 my code HANDLE hFile CreateFile pFile
  • java.lang.Thread.interrupt() 的作用是什么?

    你能解释一下什么吗java lang Thread interrupt 何时调用 Thread interrupt 设置目标线程的中断状态 标志 然后在该目标线程中运行的代码可以轮询中断状态并适当地处理它 一些阻止的方法 例如Object
  • 为什么 height: 0 不隐藏我的填充

    我有一个 div 带衬垫 我已将其设置为height 0 并给出它overflow hidden and box sizing border box div webkit box sizing border box moz box sizi
  • Do while javascript问题

    我试图在 do while 循环中发送多个帖子 但结果未添加
  • 如何从命令行更新 SSDT 项目?

    我希望能够使用SSDT SQL Server Data Tools 将我们的数据库模式置于版本控制之下 将数据库导入到 Visual Studio 中的 SSDT 项目中会创建数据库架构的良好文本表示形式 适合版本控制 现在的问题是 当对数
  • 在 Java 中格式化时间戳

    我希望以以下格式生成当前时间戳yyyy MM dd HH mm ss 我编写了以下代码 但它总是给我这种格式yyyy MM dd HH mm ss x 你如何摆脱 x part DateFormat df new SimpleDateFor
  • 根据图片名称获取url文件

    大家好 我在 WordPress 的媒体文件夹中有几张图片 当保存新图像时 WordPress 保存为年 月 name png wp content uploads 2011 01 matt png 是否可以按名称查找图像并返回 url 文
  • XCode - 动态创建的标签,当我更改文本时,它仅更改最后一个标签

    所以我有一堆动态加载的标签 他们每个人都有相同的名字 因为不知道会有多少人 我有另一种方法 不是创建标签的方法 更改其中一个标签的文本 但是当我运行它时 只有创建的最后一个标签会更改 我需要它来更改具有特定标签或其他内容的那个 非常感谢帮助
  • 获取列表中每 n 个项目的一大块项目

    假设我有以下列表 l 4 3 1 5 3 5 8 11 10 4 12 2 1 最Pythonic的切片方式是什么l为了获得长度块n离开k块之间的项目 例如 如果n 2 and k 3结果应该是 4 3 5 8 12 2 使用列表理解 e
  • Xamarin.Forms 中的圆形图像

    我需要在 Xamarin Forms 中使用带有圆角的图像控件 但我没有找到任何可以做到的财产 如何制作圆形图像 我用FF图像加载 https github com molinch FFImageLoading图书馆CachedImage对
  • 将动态数组传递给 C 中的函数

    我正在尝试创建一个函数 该函数将数组作为参数 向其添加值 如果需要 增加其大小 并返回项目的计数 到目前为止我有 int main int argc char argv int mSize 10 ent a mSize int n n ad
  • 无法使用 py2exe 以“Domain\ComputerName”pyodbc 身份登录

    好的 我有一个连接到 mssql 数据库的脚本 我需要作为我已经完成的服务运行 但是当我将它作为服务运行时 它会覆盖我在使用以下命令连接到数据库时输入的凭据 广告计算机帐户 当我单独运行它而不是作为服务运行时 它运行得非常完美 我的连接字符
  • PDF 和 MFMailComposeViewController

    编写允许用户生成 pdf 并发送的应用程序部分 似乎工作正常 发送的 PDF 在 MAC 上可以正常打开 但在 iPhone 上它只是不断加载并且永远不会打开 在 Ray Wenderlich 教程的帮助下创建了一个 pdf 文档 并通过带
  • Delphi RTTI:获取属性的类

    使用Delphi 2010和RTTI 我知道如何获取对象的类类型以及如何获取 设置对象属性的值和类型 但是如何确定属性来自继承链中的哪个类 我想以不同于主类的方式使用基类的属性 考虑这段代码 TClassBase class TObject