我正在使用 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当我按下按钮时,我运行一个使用这些类的管道。