- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想查询我正在编写的类中的一些属性(也称为注释)。
我可以用复杂的方式做到这一点,但我想使用 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 的书)所需的无数行?
最佳答案
这些过滤器是使用 Specification Pattern 实现的。另请参见 Spring.DesignPatterns.pas。
当您需要像 IEnumerable<T>.Where()
中那样的委托(delegate)时,可以使用它们。方法。
这里是从 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
...
您可以看到,不同的规范可以与 bool 逻辑组合起来形成一个表达式:方法必须是实例方法,并且必须具有 InjectAttribute,不能有 out 或 var 参数,并且不应该是构造函数。
然后可以将此组合规范分配给 TPredicate<T>
然后可以将其传递给Where 方法。
TSpecification<T>
每个 TMethodFilters 返回的是一条具有运算符重载的记录,该运算符重载生成 bool 逻辑并将其分配给 TPredicate<T>
有可能。
使用规范模式会产生非常可读且可组合的代码,因为您将所有内容分开。循环不会因内部如何确定它是否是构造函数或该方法具有什么类型的参数而变得困惑,因为每个规范都封装到自己的类中。
附注Methods
是 TRttiTypeHelper
的属性来自 Spring.Helpers 返回 IEnumerable<TRttiMethod>
.
关于delphi - 如何在 Spring4d 中使用 THasAttributeFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784329/
我是一名优秀的程序员,十分优秀!