簡體   English   中英

如何在Spring4d中使用THasAttributeFilter

[英]How do I use THasAttributeFilter in Spring4d

我想在我正在編寫的類中查詢一些屬性(也就是注釋)。

我可以用復雜的方式來做,但我想使用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的書)所需的數十億行?

這些過濾器使用規范模式實現 另請參見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
    ...

您可以看到不同的規范可以與布爾邏輯組合以形成一個表達式:方法必須是實例方法並且必須具有InjectAttribute,不能具有out或var參數,並且不應該是構造函數。

然后可以將該組合規范分配給TPredicate<T> ,然后可以將其傳遞給Where方法。

每個TSpecification<T>返回的TSpecification<T>是一個帶有運算符重載的記錄,它使得布爾邏輯可以將其分配給TPredicate<T>

使用規范模式會產生非常易讀和可組合的代碼,因為您可以將所有內容分開。 循環不會與內部結構混雜如何確定它是否是構造函數或方法具有哪種參數,因為每個規范都封裝到它自己的類中。

PS Methods是來自Spring.Helpers的TRttiTypeHelper一個屬性,它返回IEnumerable<TRttiMethod>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM