Delphi DWScript,Monkey补丁:在运行时添加方法或属性

Delphi DWScript,Monkey补丁:在运行时添加方法或属性,delphi,monkeypatching,dwscript,Delphi,Monkeypatching,Dwscript,当时,我为DWScript+SQLite编写了一个ORM映射。我已经成功地实现了普通属性(如字符串或整数)的映射,但现在我想添加外键和多对多关系。为此,我计划在类A中声明外键属性,然后在运行时向类B添加relationmanager,以对关系进行建模。我知道我可以将relationmanager放在源代码中的B类中,但是想象一下,如果我的应用程序中有一些模型,它们对用户模型具有外键,并在框架中声明。为每个新应用程序修改框架是不现实的 我的问题:如何在脚本运行时向对象/类添加新属性、字段或函数 下

当时,我为DWScript+SQLite编写了一个ORM映射。我已经成功地实现了普通属性(如字符串或整数)的映射,但现在我想添加外键多对多关系。为此,我计划在类A中声明外键属性,然后在运行时向类B添加relationmanager,以对关系进行建模。我知道我可以将relationmanager放在源代码中的B类中,但是想象一下,如果我的应用程序中有一些模型,它们对用户模型具有外键,并在框架中声明。为每个新应用程序修改框架是不现实的

我的问题:如何在脚本运行时向对象/类添加新属性、字段或函数

下面是一些解释代码:

type TClassB = class;

type TRelationManager = class end; // a class which controls the access to the relation, only a stub

type  
  [XORM_ForeignKey('LinkB')] //attribute to indicate property "LinkB" as Foreign Key
  TClassA = class(TBaseModel)
    private
      FLinkB : TClassB;
    published
      property LinkB : TClassB; //Foreign Key to TClassB
  end;

  TClassB = class(TBaseModel)
    private
    published
        // This field should be added at runtime and not directly in the source code, as shown here.
        RelationManager : TRelationManager; 
  end;

这里是DWS贡献者。DWS不支持“猴子补丁”;脚本源与Delphi源文件一样是静态的。从脚本外部(在本机代码环境中)情况有所不同,可以修改表示类的对象,但不建议这样做,因为所有偏移量都是在编译时计算的,因此最终可能会导致严重的错误


但是,如果您正在寻找AOP,那么您想要的是在编译完成之前,钩住编译时进程并在该点插入内容。但即使这样,除非已经有代码引用您插入的字段,否则拥有这个新字段也不会有多大好处。我不确定您到底想完成什么,除非您计划使用DWS的RTTI连接到field manager…

。。那么你的问题是什么?许多基数需要一个数据透视表,因此,除了外键之外,还需要一些不同的数据透视表。为什么将属性放在类级别,而不是属性级别?什么是“树管理员”?我已经调整了我的帖子并添加了一个明确的问题。我知道很多基数与外键不同。我的问题只针对方面,即如何访问另一个类上的关系(在我的示例TClassB中)。在后台到底发生了什么,在后台到底发生了什么,将被RelationManager隐藏。我不能将属性放在属性级别,因为DWScript只支持类属性。如果DWScript将实现这个扩展,我也会改变它。