Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何获取记录';什么是使用Rtti的详细信息?_Delphi_Delphi Xe_Rtti - Fatal编程技术网

Delphi 如何获取记录';什么是使用Rtti的详细信息?

Delphi 如何获取记录';什么是使用Rtti的详细信息?,delphi,delphi-xe,rtti,Delphi,Delphi Xe,Rtti,我正在编写一个Rtti类,旨在用Rtti简化和概括操作: tRTTI_Assistant = class (tObject) private fSourceObject : tObject; ... property SourceObject : tObject read fSourceObject write fSourceObject; ... end; 如何声明将接收记录的属性?我不是舒尔,你到底想做什么。但我认为你正在寻找的是仿制药 type TMyRecord =

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

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

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

我不是舒尔,你到底想做什么。但我认为你正在寻找的是仿制药

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;
类型
TMyRecord=记录
I:整数;
S:字符串;
B:布尔型;
终止
TMyObject=class
私有的
FMyRecord:T;
平民的
属性MyRecord:T读取FMyRecord写入FMyRecord;
终止

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

要想让它起作用,你必须用另一种方法。
t值
可与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的示例,请参见:

从示例中可以看出,
fSourceObject
可以是任何对象,无论其结构如何。然后,使用Rtti可封装性,我可以提取结构的所有元素。我需要一种类似的方法来传递任何记录结构,然后使用Rtti,就像我对
fSourceObject
所做的那样。如何声明将接收记录的属性?不能。要回答此问题,请改用
TValue
属性。使用RTTI和
TValue
可以解析有关记录、类等的所有信息。要从记录中获取
TValue
,请使用
TValue.from(MyRecord))。这或多或少是同一个问题。不,这不是海报想要的。海报希望使用RTTI获取信息。这里的通用代码没有添加任何内容。是的,asker对运行时而不是编译时感兴趣。但他提出这个问题是因为他想构建一个
TRtti\u Assistent
类(他是如何称呼它的)。rtti是他想在类中做的事情,他没有询问rtti,而是询问如何将任何记录传递给属性,就像将任何对象传递给
TObject
属性一样。使用泛型类,他可以传递他想要的任何记录并对其执行rtti操作。你必须理解编译时和运行时类型之间的区别。泛型要求调用方在编译时知道类型。您的泛型类型没有任何用途。你也可以直接使用记录,我知道运行时和编译时类型的区别。假设他想使用rtti为他的记录值编写一个简单的编辑器,他可以使用rtti编写类。但是他必须将他的记录传递给进行编辑的班级(使用rtti的东西)。例如
XSuperObject
还结合了泛型和rtti。在superobject中有一个通用函数,您可以在其中传递记录,它执行rtti操作以生成json字符串。他的问题是:
如何声明将接收记录的属性?
只有问题标题是关于rtti的。