あなたがあなた自身の属性を宣言したい場合、あなたはこのようにそれを行うことができます。
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
私はいつも同じ問題に直面していて、利益を見ていないので属性を使ったことは一度もありませんでした。 –
私は根本的な問題は、Delphiのプログラマが長い間ずっと多く使っていないことに慣れていることです。多くのサードパーティのコンポーネントベンダーにとって、属性を広範囲に使用することで、デルファイの古いバージョンのユーザーをターゲットにすることを防ぎ、市場をさらに制限します。 – afrazier