3

OmniThread ライブラリをいじって、パイプライン クラスにいくつかの機能を追加しています。

いくつかの属性を追加したいのですが、これを機能させるには RTTI を生成する必要があります。ディレクティブ
を使用すると、すべての Otl で RTTI が無効になっていることがわかります。 グローバルに設定するとライブラリが破損するため、これはオプションではありません。{$TYPEINFO OFF}
{$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