【问题标题】:How can I get Record's details using Rtti?如何使用 Rtti 获取 Record 的详细信息?
【发布时间】:2014-11-06 13:38:31
【问题描述】:

我正在编写一个 Rtti 类,旨在简化和概括使用 Rtti 的操作:

tRTTI_Assistant = class (tObject)
 private
  fSourceObject : tObject;
 ...
  property SourceObject : tObject read fSourceObject write fSourceObject;
 ...
 end;

如何声明将接收记录的属性?

【问题讨论】:

  • 从示例中可以看出,fSourceObject 可以是任何对象,无论其结构如何。然后,使用 Rtti 功能,我可以提取结构的所有元素。我需要一种类似的方式来传递任何记录结构,然后以与fSourceObject 相同的方式使用 Rtti。
  • 如何声明将接收记录的属性?你不能。
  • 要回答这个问题,请改用TValue 的属性。使用 RTTI 和TValue,您可以解析有关记录、类等的所有信息。要从记录中获取TValue,请使用TValue.From(MyRecord));。这与How to determine using Rtti, if a field from a class is a Record 或多或少是同一个问题。

标签: delphi delphi-xe rtti


【解决方案1】:

您不能添加可以采用任何记录结构并使用 RTTI 解析记录内部细节的记录类属性。

为此,您必须使用另一种方式。 TValue 可以与 RTTI 一起使用来解析任何类型。

所以声明:

tRTTI_Assistant = class (tObject)
 private
  //fSourceObject : tObject; // ! Use AnySource for objects as well
  fAnySource : TValue;
 ...
  //property SourceObject : tObject read fSourceObject write fSourceObject;
  property AnySource: TValue read fAnySource write fAnySource;
 ...
 end;

并称它为:

myAssistant.AnySource := TValue.From(myRecord);

现在您不仅可以使用 RTTI 来解析记录类型,还可以解析任何类型。

有关如何在TValue 上使用 RTTI 的示例,请参阅 Convert Record to Serialized Form Data for sending via HTTP

【讨论】:

    【解决方案2】:

    我不确定您到底想做什么。但我认为泛型是您正在寻找的。​​p>

    type
      TMyRecord = record
        I:Integer;
        S:string;
        B:Boolean;
      end;
    
      TMyObject<T:record> = class
      private
        FMyRecord:T;
      public
        property MyRecord: T read FMyRecord write FMyRecord;
      end;
    

    【讨论】:

    • 不,这不是发帖人要找的。发布者希望使用 RTTI 获取信息。
    • 这里的泛型没有添加任何内容。是的,asker 对运行时而不是编译时间感兴趣。
    • 但他问是因为他想建立一个TRtti_Assistent 类(他怎么称呼它)。 rtti 的东西是他想在课堂上做的事情,他没有询问 rtti,而是询问他如何将任何记录传递给属性,就像他可以将任何对象传递给 TObject 属性一样。使用泛型类,他可以传递任何他想要的记录并在上面做 rtti 的事情。
    • 你必须了解编译时和运行时类型的区别。泛型要求调用者在编译时知道类型。您的泛型类型没有任何用途。你也可以直接使用记录。
    • 我知道运行时和编译时类型的区别。假设他想使用 rtti 为他的记录值编写一个简单的编辑器,他可以使用 rtti 编写类。但他必须将他的记录传递给进行编辑的班级(使用 rtti 的东西)。例如XSuperObject 也结合了泛型和 rtti。在超级对象中,您有一个通用函数,您可以在其中传递您的记录,它会执行 rtti 来生成 json 字符串。他的问题是:How can I declare a property that will receive a Record? 只有问题标题是关于 rtti。
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多