, 당신은 이런 식으로 작업을 수행 할 수 있습니다
type
TDisplayLabelAttribute = class(TCustomAttribute)
private
FText: string;
public
constructor Create(const aText: string);
property Text: string read FText write FText;
end;
속성은 TCustomAttribute이있는 일반 클래스입니다을 조상으로 사용합니다. 당신은 평소와 같이 그것을 구현 :
implementation
constructor TDisplayLabelAttribute.Create(const aText: string);
begin
FText := aText;
end;
이제 속성이 선언 및 구현
, 당신은 단지 그것을 사용할 수 있습니다
[DisplayLabel('My Class')]
TMyClass = class
end;
을 이제 당신은 속성이 선언 및 구현하고 추가를 사용하고있다 어떤 클래스의 표시 레이블. 마지막 단계는 해당 속성을 사용하는 것입니다. 클래스 을으로 장식했기 때문입니다. 속성을 사용하는 코드는 속성이나 데코 레이팅 된 클래스에 상주하지 않으며 장식을 사용할 서비스 계층에 구현됩니다.
의 우리가 클래스의 수 표시 레이블을 반환하는 클래스가 있다고 가정 해 봅시다 :
type
TArtifactInspector = class
public
class function DisplayLabelFor(aClass: TClass): string;
end;
클래스를 검사하고 그 표시 라벨을 반환 방법은, 존재하는 주어진합니다.
implementation
uses
Rtti;
class function TArtifactInspector.DisplayLabelFor(aClass: TClass): string;
var
rttiContext: TRttiContext;
rttiType: TRttiType;
attribute: TCustomAttribute;
begin
rttiContext := TRttiContext.Create;
try
rttiType := rttiContext.GetType(aClass);
for attribute in rttiType.GetAttributes do
if attribute is TDisplayLabelAttribute then
Exit(TDisplayLabelAttribute(attribute).Text);
Result := '';
finally
rttiContext.Free;
end; // try to recover and return the DisplayLabel
end;
는 저자의 방법과 속성의 흥미로운 사용의 선언과 건설을 포함하는 전체 파일을 만들 귀찮게하지만, 우리에게 그것을 사용의에는 예제를 제공하지 않습니다 일부 텍스트가 있습니다 : 그렇지 않으면 빈 문자열을 반환합니다. – PSyLoCKe
제가 관심을 보이지 않기 때문에 저는 언젠가는 똑같은 '문제'에 빠져 들었습니다. –
근본적인 문제는 오랫동안 많은 사람들이 델파이 프로그래머들이 그렇게하지 못하는 데 익숙해 져서 우리가했던 방식보다 명확한 이익을 제공하는 곳을 많이 찾지 못했다는 것입니다. 많은 타사 구성 요소 공급 업체의 경우 특성을 광범위하게 사용하면 구형 델파이 버전 사용자를 대상으로하지 않으므로 시장을 더욱 제한 할 수 있습니다. – afrazier