如何在 Delphi 中使用 RTTI 将枚举转换为字符串并再次转换回来

Gri*_*fyn 1 delphi enums rtti

我无法根据名称而不是序数值获取枚举类型。我需要在类属性的 RTTI 循环内执行此操作。我尝试过使用 GetEnumName 和 TRTTIEnumerationType.GetName,但我似乎无法从 TRTTIProperty 实例将这些东西组合在一起。

请帮助?(下面的框架代码示例)

    用途
      RTTI、类型信息;
    
    类型
      TCustomColor = (ccBlack, ccBrown, ccBlue);
    
      TMyClass = 类
      民众
        属性自定义颜色:TCustomColor;
      结尾;
    
    程序输出;
    变量
      rc:TRTTIContext;
      rt : TRTTI 类型;
      rp : TRTTI 属性;
      mc : TMyClass;
    开始
      mc.CustomColor := ccBlue;
      rt := rc.GetType(mc.ClassType);
      对于 rt.GetProperties 中的 rp 做
        如果 rp.PropertyType.TypeKind = tkEnumeration 那么
        开始
          // TODO: 从属性中检索“ccBlue”
        结尾;
    结尾;
    
    程序输入;
    变量
      n、s:字符串;
      o:T 对象;
      rc:TRTTIContext;
      rt : TRTTI 类型;
    开始
      n := '自定义颜色';
      s := 'ccBlue';
      // 注意:o 是从它的类类型的字符串实例化的
      o := (rc.FindType('MyClass') as TRTTIInstanceType).MetaClassType.Create;
      rt := rc.GetType(o.ClassType);
      rt.GetProperty(n).SetValue(o, ???); // TODO:适当设置 o.CustomColor
    结尾;

Hea*_*are 5

请注意,在较新版本的 Delphi 中,您可以执行以下操作:

S:=TRttiEnumerationType.GetName(o.CustomColor)
Run Code Online (Sandbox Code Playgroud)