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

6
我正在使用这个代码来获取数组元素的类型。
{$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.

但是该应用程序在此行出现访问冲突并失败。
Writeln(TRttiArrayType(T).ElementType.Name);

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

1个回答

14

你的代码存在问题,TRttiArrayType 只适用于静态数组(而你的数组是动态的),为了解决这个问题,请使用TRttiDynamicArrayType,代码如下:

 Writeln(TRttiDynamicArrayType(T).ElementType.Name);

2
同时也值得一提的是,强制类型转换TRttiArrayType(T)TRttiDynamicArrayType(T)并不是一个好习惯。只有当您确定类型匹配时才应该这样做 - 而这在您的代码中并不是这种情况。在我看来,编写(T as TRttiArrayType)可能是有意义的,或者首先测试if T is TRttiArrayType then...,它执行相同的操作(但不会触发任何异常),但可以在循环之前进行一次。这将避免任何类似的类型混淆。 - Arnaud Bouchez
同意Arnaud Bouchez的观点,TSomeClass(VarSomeObj)仅适用于if VarSomeObj is TSomeClass then with TSomeClass(VarSomeObj) do Something - OnTheFly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接