3

我正在使用 OmniThread 库,向管道类添加一些功能。

我现在想添加一些属性,但要使其正常工作,我需要生成 RTTI。
事实证明,通过使用该{$TYPEINFO OFF}指令,所有 Otl 都禁用了 RTTI。
全局设置{$TYPEINFO ON}会破坏库,所以这不是一个选项。

我正在尝试为我自己的课程有选择地启用 RTTI。

{$M+}
  {$RTTI EXPLICIT METHODS([vcPrivate,vcProtected,vcPublic, vcPublished]) PROPERTIES(([vcPrivate,vcProtected,vcPublic, vcPublished])) FIELDS(([vcPrivate,vcProtected,vcPublic, vcPublished]))}
  [Capabilities([SplitInput])]
  TOmniMultiPipelineSplitter = class(TOmniMultiPipelineStage, IOmniMultiSplitter)
  public
    /// <summary>
    /// Creates a splitter with 1 input and 2 outputs.
    /// Additional outputs can be added later if required.
    /// </summary>
    constructor Create; overload;
    constructor Create(const Input: IOmniBlockingCollection); overload;
    constructor Create(PrevStage: TGUID; PrevQueue: integer); overload;
    function AddOutputQueue: IOmniBlockingCollection;
  end;
  {$M-}

但是无论我做什么,都不会生成 RTTI。

这是我用来为我的班级获取 RTTI 的代码:

  function FindAllFlavoursOf(basetype: TClass): TFlavours;
  var
    ctx: TRttiContext;
    lType: TRttiType;
  begin
    Result:= TList<TClass>.Create;
    ctx:= TRttiContext.Create;
    for lType in ctx.GetTypes do
      if (lType is TRttiInstanceType) and
        (TRttiInstanceType(lType).MetaclassType.InheritsFrom(basetype)) then begin
        Result.Add(TRttiInstanceType(lType).MetaclassType);
      end;
  end;

这段代码没有找到派生自 的类TOmniMultiPipelineStage,但它确实找到了派生自 的类TInterfacedObject
似乎包含所有具有通用参数的类。

如何让 Delphi 将 RTTI 放入我的课程中?

-- 是的,我确实在项目设置中启用了 RTTI: 在此处输入图像描述

- 是的,我的代码中使用了这些类。Go当我按下按钮时,我运行一个使用这些类的管道。

4

0 回答 0