gpt4 book ai didi

delphi - 如何使用 rtti 列出属性的属性?

转载 作者:行者123 更新时间:2023-12-03 15:12:03 28 4
gpt4 key购买 nike

我目前正在使用此代码,但未列出任何内容。我缺少什么?

program ListAttrs;

{$APPTYPE CONSOLE}

uses
Rtti,
SysUtils;

type
TPerson = class
private
FName: String;
FAge: Integer;
public
[NonEmptyString('Must provide a Name')]
property Name : String read FName write FName;
[MinimumInteger(18, 'Must be at least 18 years old')]
[MaximumInteger(65, 'Must be no older than 65 years')]
property Age : Integer read FAge write FAge;
end;


procedure test;
var
ctx : TRttiContext;
lType : TRttiType;
lAttribute: TCustomAttribute;
lProperty : TRttiProperty;
begin
ctx := TRttiContext.Create;
lType := ctx.GetType(TPerson);
for lProperty in lType.GetProperties do
for lAttribute in lProperty.GetAttributes do
Writeln(lAttribute.ToString);
end;

begin
try
Test;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

最佳答案

查看编译器警告。当我构建这个时,我看到:

[DCC Warning] ListAttrs.dpr(15): W1025 Unsupported language feature: 'custom attribute'
[DCC Warning] ListAttrs.dpr(17): W1025 Unsupported language feature: 'custom attribute'
[DCC Warning] ListAttrs.dpr(18): W1025 Unsupported language feature: 'custom attribute'

这是由于历史怪癖造成的。 Delphi for .NET 编译器支持属性,并且它们在 VCL 中广泛用于各种 .NET 事物。 Delphi for Win32 编译器必须能够读取它们并忽略它们。

然后Delphi 2010出来了,Delphi Win32突然支持属性了。但所有这些 .NET 属性在 Delphi 中都不存在。他们没有将它们全部根除,而是让编译器发出警告,然后忽略它们。 (另外,我相信我听到 Emb. 的某人说无论出于何种原因,Delphi for .NET 仍在内部使用。)

作为副作用,在类中添加实际上不存在的属性是完全有效的。它只会被编译器忽略,并且不会生成它的 RTTI。

关于delphi - 如何使用 rtti 列出属性的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com