gpt4 book ai didi

delphi - 使用DSharp的Delphi模拟将无法使用枚举器值进行编译

转载 作者:行者123 更新时间:2023-12-03 18:36:36 25 4
gpt4 key购买 nike

我在Delphi XE5中使用DSharp模拟(感谢Stefan!),但是一些枚举器有问题。如果尝试使用特定值定义枚举数,则{$ M +}伪指令将导致以下错误:

E2134 Type 'TMyEnum' has no type info


这是一个示例控制台应用程序,总结了所有这些内容:

程序DSharpMockEnum;

program DSharpMockEnum;

{$APPTYPE CONSOLE}

{$R *.res}

uses
DSharp.Testing.Mock,
System.SysUtils;

type

TBadEnum = (badEnum1 = 1, badEnum2); // <---- WONT COMPILE
TGoodEnum = (goodEnum1, goodEnum2); // This compiles OK

{$M+}
IBadMock = interface
['{34B3904E-3EBA-4C6E-BBA8-A40A67A32E7F}']
function GetEnum: TBadEnum;
procedure SetEnum(Value: TBadEnum);
property MyEnum: TBadEnum read GetEnum write SetEnum;
end;

{$M+}
IGoodMock = interface
['{34B3904E-3EBA-4C6E-BBA8-A40A67A32E7F}']
function GetEnum: TGoodEnum;
procedure SetEnum(Value: TGoodEnum);
property MyEnum: TGoodEnum read GetEnum write SetEnum;
end;

var
LGoodMock: Mock<IGoodMock>;
LBadMock: Mock<IBadMock>;
begin
try
Writeln('Good Mock');
LGoodMock.Setup.WillReturn(goodEnum1).Any.WhenCalling.MyEnum;

Writeln('Bad Mock');
LBadMock.Setup.WillReturn(badEnum1).Any.WhenCalling.MyEnum;

Writeln('Stop');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.


有什么想法或建议吗?我宁愿避免重置所有枚举,因为有些枚举存储在数据库中并且需要特定的值。
德尔福XE5。
谢谢。
瑞克

最佳答案

在错误日志中回答。具有指定值的枚举没有RTTI。如果要使用rtti和具体值的枚举,则必须使用伪仿真条目,例如
TBadEnum =(badDummy0,badEnum1,badEnum2,badDummy3,badEnum4);

这里badDummy0有效地存储0,而badDummy3为3

另一种选择是使用一些整数类型

关于delphi - 使用DSharp的Delphi模拟将无法使用枚举器值进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23925580/

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