如何在类构造函数中访问RTTI?

Joh*_*ica 5 delphi reflection rtti

不允许使用此代码:

class constructor TOmniMultiPipelineStage.Create;
var
  RTTIType: TRttiType;
begin
  RTTIType:= TRttiContext.GetType(self);
end;
Run Code Online (Sandbox Code Playgroud)

[dcc32错误] OtlParallel.pas(5040):E2003未声明的标识符:'self'

该变体也是不允许的:

class constructor TOmniMultiPipelineStage.Create;
var
  RTTIType: TRttiType;
begin
  //Not really what I want because I want the actual type of the class
  //Not a fixed ancestor type 
  RTTIType:= TRttiContext.GetType(TOmniMultiPipelineStage);
end;
Run Code Online (Sandbox Code Playgroud)

[dcc32 Error] OtlParallel.pas(5039):E2076这种形式的方法调用仅允许类方法或构造函数

如何在类构造函数中获取类的RTTI信息?

自我注意:循环遍历类的所有后代:Delphi:在运行时查找从给定基类下降的类?

Dav*_*nan 3

使用ClassInfo以下类方法TObject

class constructor TMyClass.ClassCreate;
var
  ctx: TRttiContext;
  typ: TRttiType;
begin
  typ := ctx.GetType(ClassInfo);
end;
Run Code Online (Sandbox Code Playgroud)

请注意,我还修复了调用 的语法GetType,它是一个实例方法,因此必须在 的实例上调用TRttiContext

对您来说更大的问题是类构造函数对您没有用处。类构造函数是静态的。对于定义它们的类型,它们仅执行一次。正如您所明确期望的那样,它们不会在派生类的上下文中执行。

对于类变量也是如此,您可以在评论中讨论。类变量只有一个实例。您期待并希望每个派生类都会有新的实例。

因此,虽然ClassInfo回答了您提出的问题,但它对您没有任何实际用处。