32

Delphi 2010では、型宣言とメソッドに追加できるカスタム属性が導入されました。カスタム属性を使用できる言語要素はどれですか?

私がこれまでに見つけた例には、クラス宣言、フィールド、およびメソッドが含まれます。(そして、AFAIKジェネリッククラスはカスタム属性をサポートしていません)。

この記事では、いくつかの例を示します。変数(クラス宣言の外部)も属性を持つことができるようです。

この記事に基づいて、属性は

  • クラスとレコードのフィールドとメソッド
  • メソッドパラメータ
  • プロパティ
  • 非ローカル列挙宣言
  • 非ローカル変数宣言

属性を配置できる他の言語要素はありますか?


更新:この記事は、カスタム属性をプロパティの前に配置できることを示しています:http: //francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html

次のコード例が含まれています。

type
  TConfig = class(TComponent)
  public
    [PersistAs('Config', 'Version', '1.0')]
    Version : String;
    [PersistAs('Config', 'Description', 'No description')]
    Description : String;
    FTest : Integer;
    // No attribute => not persistent
    Count : Integer;
    [PersistAs('Config', 'Test', '0')]
    property Test : Integer read FTest write FTest;
  end;

次のようなメソッド引数の属性を読み取る方法もあると思います

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);
4

1 に答える 1

27

面白い質問です!ほとんどすべての属性を宣言できます。問題は、RTTIを使用して属性を取得することです。以下のカスタム属性を宣言する簡単なコンソールデモを次に示します。

  • 列挙型
  • 関数型
  • プロシージャタイプ
  • メソッドタイプ(of object
  • エイリアスタイプ
  • レコードタイプ
  • クラスタイプ
  • クラスの内部にあるレコードタイプ
  • レコードフィールド
  • 記録方法
  • クラスインスタンスフィールド
  • class体論(class var
  • クラスメソッド
  • グローバル変数
  • グローバル機能
  • ローカル変数

propertyクラスのカスタム属性を宣言する方法が見つかりませんでした。ただし、カスタム属性をgetterメソッドまたはsetterメソッドにアタッチできます。

コード、物語はコードの後に​​続きます:

program Project25;

{$APPTYPE CONSOLE}

uses
  Rtti;

type
  TestAttribute = class(TCustomAttribute);

  [TestAttribute] TEnum = (first, second, third);
  [TestAttribute] TFunc = function: Integer;
  [TestAttribute] TEvent = procedure of object;
  [TestAttribute] AliasInteger = Integer;

  [TestAttribute] ARecord = record
    x:Integer;
    [TestAttribute] RecordField: Integer;
    [TestAttribute] procedure DummyProc;
  end;

  [TestAttribute] AClass = class
  strict private
    type [TestAttribute] InnerType = record y:Integer; end;
  private
    [TestAttribute]
    function GetTest: Integer;
  public
    [TestAttribute] x: Integer;
    [TestAttribute] class var z: Integer;
    // Can't find a way to declare attribute for property!
    property Test:Integer read GetTest;
    [TestAttribute] class function ClassFuncTest:Integer;
  end;

var [TestAttribute] GlobalVar: Integer;

[TestAttribute]
procedure GlobalFunction;
var [TestAttribute] LocalVar: Integer;
begin
end;

{ ARecord }

procedure ARecord.DummyProc;
begin
end;

{ AClass }

class function AClass.ClassFuncTest: Integer;
begin
end;

function AClass.GetTest: Integer;
begin
end;

begin
end.

問題は、これらのカスタム属性を取得することです。ユニットを見ると、次のrtti.pasカスタム属性を取得できます。

  • レコードタイプ(TRttiRecordType
  • インスタンスタイプ(TRttiInstanceType
  • メソッドタイプ(TRttiMethodType
  • ポインタタイプ(TRttiPointerType)-何に使用されますか?
  • プロシージャタイプ(TRttiProcedureType

「ユニット」レベルまたはローカル変数とプロシージャのRTTIを取得する方法はありません。したがって、属性に関する情報を取得する方法はありません。

于 2011-05-25T06:10:15.727 に答える