【问题标题】:Delphi 2010 RTTI : How to interegate/explore an enumeration containing custom attributeDelphi 2010 RTTI:如何整合/探索包含自定义属性的枚举
【发布时间】:2010-10-28 14:43:58
【问题描述】:

我使用 TCustomAttribute 后代类 (TEnumAttribute) 创建了一个枚举,为每个枚举提供额外的数据(如果成功,它将驱动一个自定义组件,该组件可以询问一个枚举并相应地填充自身)。

type TShoppingCartType = ( [TEnumAttribute(0, 'All')] sctAll, [TEnumAttribute(1, 'Web Shopping Cart')] sctWebShoppingCart, [TEnumAttribute(2, 'Wish List')] sctDefaultWebWishList, [TEnumAttribute(3, 'Custom')] sctWebCustomList );

我可以很好地获取名称和值(使用相应的 TypeInfo GetEnum 方法),但是如何访问枚举中的每个值并访问它的定义属性?

感谢您提供任何信息

【问题讨论】:

    标签: delphi delphi-2010 rtti


    【解决方案1】:

    据我所知,您只能用属性注释 types。由于枚举值只是一个简单的序数值,因此您的方法可能不起作用。

    如果枚举值本身就是类型,您将使用TRttiContextTRttiType,如官方文档中所述:

    http://docwiki.embarcadero.com/RADStudio/XE/en/Extracting_Attributes_at_Run_Time

    用经典的方式做似乎更合适:

    TShoppingCartTypeDescriptions = array[TShoppingCartType] of string;
    
    ...
    
    Descriptions: TShoppingCartTypeDescriptions;
    Descriptions[sctAll] := 'All';
    Descriptions[sctWebShippingCart] := 'Web Shopping Cart';
    // and so on
    

    您可以使用以下方法枚举所有值:

    var 
      I: TShoppingCartType;
    begin
    
      for I := Low(TShoppingCartType) to High(TShoppingCartType) do
          // Do something with I
    
    end;
    

    【讨论】:

    • 谢谢!在过去的 6 个小时里,我可能一直在玩弄获得正确值的每一种排列方式。我希望有一个没有记录的'Marco Cantu'-ish 轻巧的技巧。 :)
    • @KevinRF:没问题,有时最简单的解决方案是最有效的。作为替代方案,您也可以使用字典或其他智能数据结构来解决您的问题。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2011-07-03
    相关资源
    最近更新 更多