固定枚举不返回RTTI属性:它是一个错误吗?

use*_*561 2 delphi rtti

我需要浏览一些类的所有已发布属性.未列出类型为具有固定值的枚举的属性.

见下面的例子:

TMyEnum = (meBlue, meRed, meGreen);
TMyEnumWithVals = (mevBlue=1, mevRed=2, mevGreen=3);
TMyClass =
...
published
  property Color: TMyEnum read FColor write SetColor; // This one is found
  property ColorVal: TMyEnumWithVals read FColorVal write SetColorVal; // This one is never found
end;
Run Code Online (Sandbox Code Playgroud)

我需要固定值,因为这些属性存储在数据库中,我需要确保分配的值始终是相同的,无论下一版本中的Delphi编译器选择如何,并防止在枚举列表中任何错误的未来值插入.

我尝试使用新的Delphi 2010 RTTI(带.GetDeclaredProperties)和"旧"RTTI(带GetPropInfos):除上述类型的属性外,找到所有属性.

在所有类中都可以看到相同的行为.我还在一个示例项目中复制了这个.

尝试使用和不使用各种RTTI指令而不进行更改.

这是一个错误,一个已知的限制?是否有解决方法(除了删除枚举的固定值)?

使用Delphi2010 Ent + Update5

[编辑]答案下面提供变通方法:枚举的第一个值必须被设置为0而不是1,和值是连续的.经过测试和工作的解决方案

谢谢,

Wou*_*ick 6

巴里凯利:

不以零开头的不连续枚举和枚举没有typeinfo.对于所属类别中实现,这将需要从现有tkEnumeration不同的格式,由于向后兼容性问题.

我考虑为Delphi 2010实现一个tkDiscontiguousEnumeration(或者可能更好的命名成员),但考虑到它们的相对稀缺性和枚举的困难,它的好处似乎很小 - 你如何有效地编码范围?某些编码对某些情况更好,对其他情况则更糟.

所以这不是一个错误,而是一个已知的限制.