gpt4 book ai didi

delphi - TDictionary 转换在引用的包中失败

转载 作者:行者123 更新时间:2023-12-03 15:58:00 24 4
gpt4 key购买 nike

将 TDictionary 分配给 TObject 变量。我可以在同一项目中将 TOBject 转换回 TDictionary。但是,如果在引用的 bpl 项目中完成转换,则转换会失败,具体取决于项目的引用方式。

测试代码:

procedure TestTDefault.Test1;
var
Obj: TObject;
begin
Obj := TDictionary<string, Integer>.Create;
Check(Obj is TDictionary<string, Integer>);
CheckNotNull(Obj as TDictionary<string, Integer>);

// this calls the function in the referenced bpl package.
// Returns True if Obj can be cast back to a TDictionary.
CheckTrue(TestIfDictionary(Obj)); // outcome depends if referenced packge is included in <DCC_UsePackage>
end;

依赖包中的函数:

function TestIfDictionary(aObject: TObject): Boolean;
begin
Result := aObject is TDictionary<string,Integer>;
end;

我有一个简单的项目组,只有两个包:

  1. DUnit 测试运行程序 (Package1Tests.exe)
  2. 包1.bpl

Project Group

两个包都具有相同的编译器/链接器选项集。

非常奇怪的是,只有当 Package1 没有被列为运行时包时,测试才有效: Correct

但是,如果 Package1 被列为运行时包,测试就会失败! enter image description here

我正在使用XE2。至于目的,这个问题在处理RTTI时就出现了。我能够在这个简单的测试项目中隔离问题。问题与 RTTI 无关。需要注意的是,如果我不使用 TDictionary,而使用 TStringList,则测试始终有效。所以问题似乎与泛型有关。如果需要,我可以提供简单的测试项目。

我花了相当多的时间来解决这个问题。我很高兴我发现了引发问题的原因。但不幸的是我无法理解为什么会发生这种情况。

最佳答案

您遇到的问题与通用实例化有关。每个模块都单独实例化通用类型,因此它们具有不同的类型标识。这是泛型设计及其与运行时包交互的基本限制。

您可以在包中的单元中实例化泛型类型,例如如下所示:

type
TDictionaryStringInteger = class(TDictionary<string, Integer>);

然后使用TDictionaryStringInteger代替TDictionary<string, Integer> 。但是,这会严重破坏您的代码,因为它会阻止您编写使用泛型类型的泛型方法。

摆脱束缚的另一种方法是停止使用运行时包。坦率地说,这对我来说似乎更有吸引力。

关于delphi - TDictionary 转换在引用的包中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com