我正在使用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:
- 是的,我的代码中使用了这些类。当我按 Go 按钮时,我运行一个使用这些类的管道。