2011-05-10 4 views
6

Delphi Attributes에는 상수 매개 변수가 필요합니까? 그렇다면 왜?

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 

나는 그것이 그 속성과 관련이 있다고 가정합니다. 컴파일러 시간에 바운드되어야한다.

따라서 내 질문은 다음과 같습니다.

"시스템을 손상"하는 방법이 있습니까?이 속성의 해당 지점에 런타임 값이 있습니까?

답변

8

그래, 매개 변수가 컴파일 타임에 상수로 평가되고 RTTI 테이블에 저장되므로 상수가 필요합니다. 또한 속성은 객체 인스턴스가 아닌 클래스에 속하므로 둘 이상의 TC 고객이있는 경우 아이디어가 무의미 해집니다.

매개 변수없는 생성자 (또는 생성자 없음)를 특성에 지정하고 문자열을 추출 할 수있는 문자열이나 개체를 받아들이는 메서드로 DisplayText 속성을 변경하여 시스템을 이길 수 있습니다.

+0

감사합니다. Mason. 나는 그걸 가지고 놀 것이다. –

+0

그리고 속성 선언에서이 새 메서드를 어떻게 호출합니까? –

+0

@Nick : ... 다른 객체에서 메서드를 호출하는 것과 같은 방법입니까? (귀하의 질문을 이해할 수 있는지 확실하지 않습니다.) –

관련 문제