为什么编译器不生成任何RTTI?

时间:2014-07-16 18:33:47

标签: delphi rtti delphi-xe6 compiler-directives

我正在使用OmniThread lib,为管道类添加了一些功能。

我现在想添加一些属性,但为了实现这一点,我需要生成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: enter image description here

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

0 个答案:

没有答案