我想在我正在编写的类中查询一些属性(也就是注释)。
我可以用复杂的方式来做,但是我想用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编写所需的大量行(例如,按照尼克·霍奇斯的书)?
发布于 2014-07-16 19:11:19
这些过滤器是使用规格模式实现的。另见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>返回的TMethodFilters是一个带有操作符重载的记录,这使得布尔逻辑成为可能,并将其分配给TPredicate<T>。
使用规范模式会导致代码的可读性和可组合性,因为所有的代码都是分开的。由于每个规范都封装在自己的类中,所以循环不会被内部元素弄得杂乱无章,如何确定它的构造函数或方法具有什么类型的参数。
Methods是来自Spring.Helpers的TRttiTypeHelper的一个属性,该属性返回IEnumerable<TRttiMethod>。
https://stackoverflow.com/questions/24784329
复制相似问题