如何在Delphi中使用RTTI或TypeInfo获取枚举的有效范围
发布时间:2020-12-15 09:37:17 所属栏目:大数据 来源:网络整理
导读:我在测试项目中使用RTTI来评估枚举值,最常见的是对象的属性.如果枚举超出范围,我想显示类似于评估/修改IDE窗口所显示的文本.像“(超出范围)255”之类的东西. 下面的示例代码使用TypeInfo在使用GetEnumName时将枚举之外的值显示为访问冲突.使用RTTI或TypeInfo
我在测试项目中使用RTTI来评估枚举值,最常见的是对象的属性.如果枚举超出范围,我想显示类似于评估/修改IDE窗口所显示的文本.像“(超出范围)255”之类的东西.
下面的示例代码使用TypeInfo在使用GetEnumName时将枚举之外的值显示为访问冲突.使用RTTI或TypeInfo的任何解决方案都会对我有所帮助,我只是不知道我的测试代码中的枚举类型 program Project60; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils,TypInfo; Type TestEnum = (TestEnumA,TestEnumB,TestEnumC); const TestEnumUndefined = TestEnum(-1); procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer); begin WriteLn(Format('Ordinal: %d = "%s"',[AOrdinal,GetEnumName(ATypeInfo,AOrdinal)])); end; var TestEnumTypeInfo: PTypeInfo; begin try TestEnumTypeInfo := TypeInfo(TestEnum); WriteEnum(TestEnumTypeInfo,Ord(TestEnumA)); WriteEnum(TestEnumTypeInfo,Ord(TestEnumB)); WriteEnum(TestEnumTypeInfo,Ord(TestEnumC)); WriteEnum(TestEnumTypeInfo,Ord(TestEnumUndefined)); //AV except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; ReadLn; end. 解决方法
使用
GetTypeData() 从
PTypeInfo 获取更多详细信息,例如:
procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer); var LTypeData: PTypeData; begin LTypeData := GetTypeData(ATypeInfo); if (AOrdinal >= LTypeData.MinValue) and (AOrdinal <= LTypeData.MaxValue) then WriteLn(Format('Ordinal: %d = "%s"',AOrdinal)])) else WriteLn(Format('Ordinal: %d (out of bound)',[AOrdinal])); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |