【发布时间】:2015-05-12 14:38:19
【问题描述】:
一个 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;
我有一个简单的项目组,只有两个包:
- DUnit 测试运行程序 (Package1Tests.exe)
- Package1.bpl
两个包都有相同的编译器/链接器选项集。
非常奇怪的是,仅当 Package1 未列为运行时包时,测试才有效:
但是,如果 Package1 被列为运行时包,则测试失败!!
我正在使用 XE2。至于目的,这个问题在处理RTTI时浮出水面。我能够在这个简单的测试项目中隔离问题。问题与 RTTI 无关。 请注意,如果我不使用 TDictionary 而不是使用 TStringList,那么测试总是有效的。所以问题似乎与泛型有关。 如果需要,我可以提供简单的测试项目。
我花了相当长的时间来追踪这个问题。我很高兴我能发现引发问题的原因。但不幸的是,我无法理解为什么会发生这种情况。
【问题讨论】:
标签: delphi delphi-xe2