【问题标题】:How I can get the element type of an array using RTTI如何使用 RTTI 获取数组的元素类型
【发布时间】:2011-12-31 02:36:40
【问题描述】:

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

{$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 获取数组的元素类型?

【问题讨论】:

    标签: delphi delphi-xe rtti


    【解决方案1】:

    您投错了TRttiArrayType 用于静态数组(并且您的数组是动态的),要解决此问题,请改用TRttiDynamicArrayType:

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

    【讨论】:

    • 另外值得一提的是,强制类型转换TRttiArrayType(T) 或TRttiDynamicArrayType(T) 不是一个好习惯。只有当您确定类型匹配时,您才应该这样做 - 您的代码中并非如此。恕我直言,写(T as TRttiArrayType) 可能有意义,或者首先测试if T is TRttiArrayType then...,它执行相同的操作(但不会触发任何异常),但可以在循环之前进行一次,例如。它将避免任何类似的类型混淆。
    • 同意Arnaud Bouchez,TSomeClass(VarSomeObj) 只适用于if VarSomeObj is TSomeClass then with TSomeClass(VarSomeObj) do Something
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2011-10-25
    • 2013-10-28
    • 2019-11-17
    • 2018-07-20
    • 2014-01-04
    相关资源
    最近更新 更多