gpt4 book ai didi

delphi - Delphi 属性需要常量参数吗?如果是这样,为什么?

转载 作者:行者123 更新时间:2023-12-03 14:59:42 24 4
gpt4 key购买 nike

考虑以下(无法编译的)代码:

program AttributesTestProgram;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes,
RTTI;

type

TDisplayTextAttribute = class(TCustomAttribute)
private
FDisplayText: string;
public
constructor Create(aDisplayText: string);
property DisplayText: string read FDisplayText write FDisplayText;
end;

constructor TDisplayTextAttribute.Create(aDisplayText: string);
begin
FDisplayText := aDisplayText;
end;

function GetFirstName: string;
begin
Result := 'First Name';
end;


type
TCustomer = Class(TObject)
private
FFirstName: string;
FLastName: string;
FStreetAddress: string;
FZIP: string;
FState: string;
FCity: string;
FPhone: string;
published
[TDisplayTextAttribute(GetFirstName)]
property FirstName: string read FFirstName write FFirstName;
end;

begin
// Code that does the work removed for clarity....
Readln;
end.

我自然想知道为什么它无法编译并出现错误:

[DCC Error] AttributesTestProgram.dpr(40): E2026 Constant expression expected

我认为这与属性必须在编译时绑定(bind)的想法有关,或者与这些想法有关。

因此,我的问题是:

有什么方法可以在这里“击败系统”并将运行时值获取到属性中的该位置吗?

最佳答案

是的,您需要常量,因为参数在编译时被评估为常量并存储在 RTTI 表中。另外,属性属于类,而不属于对象实例,因此如果您有多个 TCustomer,您的想法就变得毫无意义。

您可以通过为属性提供无参数构造函数(或根本没有构造函数)并将 DisplayText 属性更改为其接受字符串或可以从中提取字符串的对象的方法来击败系统。

关于delphi - Delphi 属性需要常量参数吗?如果是这样,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953106/

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