[英]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.