如何在Delphi的OnEval函数中识别被调用的重载Tag函数?
在Delphi的OnEval中区分重载的Tag函数
你提到的Info.Params.Count确实是区分这两个重载函数最直接可靠的方式,因为两个Tag函数的参数数量存在明显差异:
- 当
Info.Params.Count = 1时,调用的是接受单个字符串参数的Tag(string)重载 - 当
Info.Params.Count = 2时,调用的是接受两个整数参数的Tag(Integer, Integer)重载
如果需要更严谨的判断(避免传入参数类型不匹配的情况),还可以结合参数的类型进行验证:
示例实现代码
procedure TYourClass.OnEval(Sender: TObject; Info: TExprEvalInfo); begin if UpperCase(Info.FuncName) = 'TAG' then begin case Info.Params.Count of 1: begin // 验证参数是否为字符串类型 if Info.Params[0].DataType in [ftString, ftWideString, ftUnicodeString] then Info.Result.AsString := Tag(Info.Params[0].AsString) else raise Exception.Create('Tag函数参数类型错误,需传入字符串'); end; 2: begin // 验证两个参数是否为整数类型 if (Info.Params[0].DataType = ftInteger) and (Info.Params[1].DataType = ftInteger) then Info.Result.AsString := Tag(Info.Params[0].AsInteger, Info.Params[1].AsInteger) else raise Exception.Create('Tag函数参数类型错误,需传入两个整数'); end; else raise Exception.Create('Tag函数参数数量错误,需传入1个字符串或2个整数'); end; end; end;
补充说明
- 参数数量判断是核心:因为两个重载的参数数量不同,这是最直观的区分依据,无需复杂逻辑
- 类型验证可选:如果你的场景中可能出现参数数量匹配但类型错误的情况,加入类型检查可以提前抛出明确的错误,避免后续执行异常
内容的提问来源于stack exchange,提问作者Petey
相关产品推荐
相关产品推荐

