Delphi 2010 RTTI:探索枚举

ZeD*_*aye 13 delphi enumeration rtti delphi-2010

考虑这样的枚举:

type
  TTypeOfData = (
    [XmlName('ABC')] todABC,
    [XmlName('DEF')] todDEF,  
    [XmlName('GHI')] todGHI
  );
Run Code Online (Sandbox Code Playgroud)

其中XmlName是一个自定义属性,用于为此枚举的成员定义序列化字符串.

如何浏览附加到此枚举的每个成员的属性?

All*_*uer 18

虽然巴里清楚地回答了关于枚举元素属性的问题,但我会另外提出一个建议.从你的例子中,你在每个枚举元素前面加上'tod',这在Delphi中是传统的,因为枚举元素在范围上是全局的(即如果除了todABC枚举元素之外你在范围内有标识符todABC,你可以得到一些奇怪的行为).

从D2007开始,我们引入了"范围枚举"的概念,当启用它时,要求您使用枚举本身的标识符限定枚举元素.例如:

{$SCOPEDENUMS ON}
type
  TTypeOfData = (ABC,DEF,GHI);
Run Code Online (Sandbox Code Playgroud)

将要求您将ABC元素称为TTypeOfData.ABC.这允许您使用非前缀的枚举元素标识符,并且不会冒着冲突的风险,因为元素被"限定"为枚举.启用{$ SCOPEDENUMS}时声明的任何枚举都将以这种方式运行.

鉴于此,您现在可以安全地使用RTTI以您希望的格式获取实际的枚举元素名称.


Bar*_*lly 14

与枚举中的元素关联的属性当前未存储在可执行文件中的Win32 RTTI数据中.RTTI已经负责公平地增加可执行文件的大小,因此必须在某处绘制一些行.Delphi Win32中的属性在类型,记录字段,字段,方法,参数和类属性上受支持.

由于与Delphi for .NET的向后兼容性,属性声明不会导致错误.

  • 很好的解释.但在这种情况下,IMO应该引起"不支持的语言功能"警告,就像其他无效的属性使用一样. (8认同)