如何使用RTTI获取数组的元素类型

Sal*_*dor 4 delphi rtti delphi-xe

我正在使用此代码来获取数组的元素类型

{$APPTYPE CONSOLE}    
uses
  Rtti,
  SysUtils;

type
  TFooArray= array  of TDateTime;

Var
  T : TRttiType;
begin
  try
     T:=TRttiContext.Create.GetType(TypeInfo(TFooArray));
      Writeln(TRttiArrayType(T).ElementType.Name);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Run Code Online (Sandbox Code Playgroud)

但是该应用程序因此行上的访问冲突而失败

Writeln(TRttiArrayType(T).ElementType.Name);
Run Code Online (Sandbox Code Playgroud)

如何使用RTTI获取数组的元素类型?

RRU*_*RUZ 11

TRttiArrayType对于静态数组(并且您的数组是动态的),您的转换是错误的,要修复问题,请使用TRttiDynamicArrayType相反的方式:

 Writeln(TRttiDynamicArrayType(T).ElementType.Name);
Run Code Online (Sandbox Code Playgroud)

  • 而且,这也是值得一说的强制类型转换`TRttiArrayType(T)`或`TRttiDynamicArrayType(T)`是不是一个好习惯.只有在确定*类型匹配时才应该这样做 - 在代码中不是这种情况.恕我直言,写`(T为TRttiArrayType)`可能是有意义的,还是第一次测试`如果T TRttiArrayType然后...`执行相同(但不会引发任何异常),而是一个循环之前,可以进行一次,例如.它将避免任何类似的类型混淆. (2认同)