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ます。