3

私が書いているクラスのいくつかの属性 (別名アノテーション) を照会したいと思います。

複雑な方法で行うこともできますが、代わりに Spring4D を使用したいと考えています。

というユニットReflectionがあり、必要なものは揃っているようですが、使い方がわかりません。

ネットで調べましたが、このユニットの使い方の例はありません。

私が見つけた:

THasAttributeFilter 

次のようになります。

  THasAttributeFilter<T: TRttiObject> = class(TMemberSpecificationBase<T>)
  private
    fAttributeClass: TAttributeClass;
  protected
    function Accept(const member: T): Boolean; override;
  public
    constructor Create(attributeClass: TAttributeClass);
  end;

素晴らしいので、次のようなフィルターを作成します。

type
  Capability = (CanDoA, CanDoB);
  TCapabilities = set of Capability;

[Capabilities(CanDoA)]
TMyClass = class(TParent)
strict private
  class var fCapabilities: TCapabilities;
....
public
  property Capabilities: TCapabilities read GetCapabilities;
end;

次のように HasAttributeFilter を作成できます。

HasAttr:= THasAttributeFilter<TMyClass>.Create(CapabilitiesAttribute);
... ?? now what ??

Spring4D を使用して属性をテストするには、古典的な RTTI の記述 (Nick Hodges の本など) に必要な無数の行を記述する必要はありません。

4

1 に答える 1

3

これらのフィルターは、仕様パターンを使用して実装されます。Spring.DesignPatterns.pas も参照してください。

メソッドのようにデリゲートが必要な場合に使用されますIEnumerable<T>.Where()

Spring4D 自体 (Spring.Container.Builder) から抜粋したコードを次に示します。

var
  condition: TPredicate<TRttiMethod>;
  method: TRttiMethod;
  ...
begin
  condition := TMethodFilters.IsInstanceMethod
    and TMethodFilters.HasAttribute(InjectAttribute)
    and not TMethodFilters.HasParameterFlags([pfOut, pfVar])
    and not TMethodFilters.IsConstructor;
  for method in model.ComponentType.Methods.Where(condition) do
    ...

さまざまな仕様をブール論理と組み合わせて 1 つの式を形成できることがわかります。メソッドはインスタンス メソッドである必要があり、InjectAttribute を持っている必要があり、out または var パラメーターを持ってはならず、コンストラクターであってはなりません。

この結合された仕様はTPredicate<T>、Where メソッドに渡すことができる に割り当てることができます。

TSpecification<T>TMethodFilters によって返される は、ブール論理を作成し、それをTPredicate<T>可能に割り当てる演算子のオーバーロードを伴うレコードです。

仕様パターンを使用すると、すべてが分離されているため、非常に読みやすく構成可能なコードになります。すべての仕様が独自のクラスにカプセル化されているため、ループがコンストラクターであるかどうか、またはメソッドが持つパラメーターの種類を決定する方法で内部が乱雑になることはありません。

PSMethodsは、TRttiTypeHelperSpring.Helpers からのプロパティであり、 を返しますIEnumerable<TRttiMethod>

于 2014-07-16T19:11:19.943 に答える