type
CommandSetOne = (Command1, Command2, Command3);
CommandSetTwo = (Command4, Command5, Command6);
TRobot = class
procedure RegisterCommands(anyEnumerationType : TRttiEnumerationType);
procedure ExecuteCommands(anEnumeration : theEnumerationType);
end;
我可能有多组命令,而且命令集中的任何命令都可以替换。
TRobot有一个过程可以将枚举类型作为参数,并保存此类型,用于ExecuteCommands过程。
关于传递任何枚举类型作为参数,我发现可以使用TRttiEnumerationType来实现,在调用方面应该如下所示:
var
rttiContext : TRttiContext;
typeref : TRttiType;
RobotA : TRobot;
begin
rttiContext := TRttiContext.Create();
RobotA := TRobot.Create();
RobotA.RegisterCommands(rttiContext.GetType(TypeInfo(CommandSetOne)));
end;
但是我在传递像Command1这样的命令时遇到了问题。我尝试过使用Variant类型来代替EnumerationType,但似乎无法将Command1传递给它。
我知道如果我使用类似TStringList的东西,这是更容易实现我想要的功能的方法,但是我希望Delphi在编译时进行检查,以防我输错命令(使用TstringList,我可以添加代码在运行时检查)。
所以真正的问题是:
我应该使用哪种类型来代替EnumerationType?
如果这不可能,是否有其他解决方案可以使用枚举?
或者,是否有任何解决方案可以提供编译时检查和灵活的结构?
编辑:
感谢David的建议,我应该同时使用Rtti,因此为了使其清晰,我添加了RegisterCommands的实现。
implementation
procedure TRobot.RegisterCommands(anyEnumerationType : TRttiEnumerationType);
begin
theEnumerationType := anyEnumerationType;
end;
procedure TRobot.ExecuteCommands (anyEnumerationValueoftheType : ???);
begin
//do something with the command
end;
那么对于该类型的任何枚举值应该适用什么?
例如,如果我在RegisterCommands中使用CommandSetOne,那么delphi如何接受Command1或Command2或Command3?
更具体地说,delphi能否仅限于Command1或Command2或Command3?这意味着如果我放置Command4,它会给我一个编译错误吗?