首页 > 解决方案 > 记录类型的类型信息在运行时不起作用

问题描述

我在Delphi下编译有点问题:

function T_QS2ProcessMailbox.PutRec<T>(const aID: T_Barcode; var aRec: T;const aTxt: String): Boolean;
var
  FA: T_FahrauftragRec absolute aRec;
  LP: T_LagerpackungRec absolute aRec;
begin
  init_Rec;
  Rec.ID        := aID;
  Rec.EventTime := Now;
  Rec.Text      := aTxt;
  if TypeInfo(T_LagerpackungRec) = TypeInfo(T) then
  begin
    Rec.RecType := C_QS_TYPE_TLAGERPACKUNGREC;
    Rec.FA      := FA;
  end
  else
    if Typeinfo(T) = Typeinfo(T_LagerpackungRec) then
    begin
      Rec.RecType := C_QS_TYPE_TFAHRAUFTRAGREC;
      Rec.LP      := LP;
    end
    else
      Rec.RecType := C_QS_TYPE_TEXT;
  Send_TraceMsg(ClassName + '.PutRec Type=' + IntToStr(Rec.RecType));
  Result        := PutRec(Rec);
end;

它编译良好,没有错误、消息或提示。但它是在没有if语句的情况下编译的。您可以在图片中查看它 - 此代码没有编译标记

图片

我不懂为什么。

有人可以向我解释我做错了什么吗?

标签: delphirttitypeinfo

解决方案


这些if语句可以在编译时解析,因此对于任何给定的T. (换句话说,编译后的代码永远不会if为这个函数执行任何代码)。

我可以想象只看到 1 个编译标记的 2 个原因。要么您的应用程序将只使用其中一条if语句,要么 IDE 将所有if语句的编译标记映射到同一行(我发现最后一个不太可能,但我在 IDE 中看到了奇怪的东西)。

另一种可能性是您的第二个if应该阅读

if Typeinfo(T) = Typeinfo(T_FahrauftragRec) then

代替

if Typeinfo(T) = Typeinfo(T_LagerpackungRec) then

推荐阅读