首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在THasAttributeFilter中使用Spring4d

如何在THasAttributeFilter中使用Spring4d
EN

Stack Overflow用户
提问于 2014-07-16 15:09:55
回答 1查看 308关注 0票数 3

我想在我正在编写的类中查询一些属性(也就是注释)。

我可以用复杂的方式来做,但是我想用Spring4D代替。

它有一个叫做Reflection的单元,看起来它有我所需要的东西,但是我不知道如何使用它。

我看过这个网络,但是没有关于如何使用这个单元的例子。

我发现:

代码语言:javascript
复制
THasAttributeFilter 

看起来是这样的:

代码语言:javascript
复制
  THasAttributeFilter<T: TRttiObject> = class(TMemberSpecificationBase<T>)
  private
    fAttributeClass: TAttributeClass;
  protected
    function Accept(const member: T): Boolean; override;
  public
    constructor Create(attributeClass: TAttributeClass);
  end;

很好,所以我创建了这样一个过滤器:

代码语言:javascript
复制
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:

代码语言:javascript
复制
HasAttr:= THasAttributeFilter<TMyClass>.Create(CapabilitiesAttribute);
... ?? now what ??

如何使用Spring4D测试属性,而不必编写经典RTTI编写所需的大量行(例如,按照尼克·霍奇斯的书)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-16 19:11:19

这些过滤器是使用规格模式实现的。另见Spring.DesignPatterns.pas。

当您需要类似于IEnumerable<T>.Where()方法中的委托时,就会使用它们。

下面是来自Spring4D本身(Spring.Container.Builder)的代码片段:

代码语言:javascript
复制
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>返回的TMethodFilters是一个带有操作符重载的记录,这使得布尔逻辑成为可能,并将其分配给TPredicate<T>

使用规范模式会导致代码的可读性和可组合性,因为所有的代码都是分开的。由于每个规范都封装在自己的类中,所以循环不会被内部元素弄得杂乱无章,如何确定它的构造函数或方法具有什么类型的参数。

Methods是来自Spring.Helpers的TRttiTypeHelper的一个属性,该属性返回IEnumerable<TRttiMethod>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24784329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档