微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在运行时向对象添加属性

如何解决在运行时向对象添加属性

Delphi RTTI 使在运行时枚举和提取有关对象的属性、字段和方法的信息变得非常容易。 但是,是否可以在运行时为对象添加属性和字段?

我意识到如果 VMT 依赖于 getter/setter,这将涉及对 VMT 的更改,这就是我提到字段的原因,因此注入的属性可以绑定到所述字段,从而避免将节点附加到 VMT 树。

这似乎是一个愚蠢的问题,但我正在研究布局设计师。您可以四处移动和定位的对象代表网络元素,它们都具有不同的属性

如果我能以某种方式使用 Web 元素的实际属性填充这些代理设计对象,这将为我节省大量时间。然后我可以直接对它们使用普通的对象检查器,而不必手动填充检查器行。

序列化也会更容易,因为我可以使用标准的 Delphi 方式,而不是手写 IO 代码

我怀疑在没有某种形式的黑客攻击的情况下这是可能的,但最好还是问一下。

解决方法

Delphi 是一种静态类型语言。但是,您可以使用变体 - 准确地说是自定义变体来创建动态属性。

type
  TMyCustomObject= class(TInvokeableVariantType)
  public
    procedure Clear(var V: TVarData); override;
    procedure Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean); override;
    function GetProperty(var Dest: TVarData; const V: TVarData; const Name: string): Boolean; override;
    function SetProperty(const V: TVarData; const Name: string; const Value: TVarData): Boolean; override;
  end;

你可以在上面的代码中实现几个虚方法并得到想要的结果。

这是一个教程: http://www.uweraabe.de/Blog/2010/08/07/a-magical-gathering-part-2/

,

另一种方法是不依赖直接的 RTTI,而是依赖中间描述层。

您可以根据 RTTI 中的内容从 RTTI 初始化中间层,并为您的动态属性添加额外内容。

这还可以让您的布局设计师免受 RTTI 怪癖的影响。 RTTI 公开的大部分内容都非常低级,其中很多是“不安全的”,因为它会触发对象中的不安全行为(从而使您的设计器崩溃)。

如果您不能 100% 控制对象来解决它们的问题,这尤其重要,我猜您没有,否则您将不需要动态属性。

在交互设计期间,无效的属性值是常态:部分输入、打字错误、不连贯的设置等。所有这些都需要某种特定于上下文的清理,中间层可以提供。

在 Delphi IDE 中,设计时清理基本上取决于每个单独组件的实现和 csDesigning 组件状态。虽然它很简单,但组件可以提供的关于不连贯或无效的属性的反馈非常有限。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。