DWScript,Monkey Patching:在运行时添加方法或属性

时间:2014-07-26 13:32:06

标签: delphi monkeypatching dwscript

目前我为DWScript + SQLite编写了一个ORM映射。我已成功实现了普通属性的映射(如字符串或整数),但现在我想添加外键多对多关系。为此,我计划在类A中声明外键属性,然后在运行时向类B添加关系管理器,以建模关系。我知道我可以将关系管理器放在源代码中的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;

1 个答案:

答案 0 :(得分:1)

DWS撰稿人。 DWS不支持猴子修补;"脚本源与Delphi源文件一样静态。从脚本的外部(在本地代码中),事物是不同的,并且可以修改代表类的对象,但是不建议这样做,因为所有的偏移都已经在编译时间,所以你可能最终导致严重的错误。

如果您正在寻找AOP,那么您想要的是在编译完成之前挂钩编译时进程并在那时插入内容。但即便如此,除非已经有代码提及你要插入的字段,否则这个新领域不会有太多好处。我不确定您要完成的是什么,除非您打算使用DWS的RTTI连接到现场经理...