我创建了一个OnMethodBoundary
方面来跟踪模板方法中的进度事件。从整体进度来看,有用的事情之一就是我的流程在完成之前所需的进度步骤数,即用[AffectsProgress]
属性标记的方法数。
我尝试使用System.Reflection
来确定代码如下(我尝试了很多变种),而不是对其进行硬编码并且必须在我添加和删除方法时对其进行维护:
typeof (MyModuleWithProgressSteps)
.GetMethods(/* whatever BindingFlags I need */)
.SelectMany(x => x.CustomAttributes.Where(attribute => attribute.AttributeType == typeof (AffectsProgress)))
但是,即使我在删除Where
子句时能够看到其他属性,我也无法找到任何PostSharp方面。我天真的猜测是,执行时干扰调用堆栈的PostSharp方面实际上并不是传统的方法属性,因此System.Reflection
库看不到它们。
有没有人知道我可以通过System.Reflection
或PostSharp本身获得我想要的方式?我遇到ReflectionSearch和IAspectRepositoryService需要Ultimate版本,但我不确定这些是否足够。
编辑:@Daniel Balas解决。使用该答案和我发现的信息here我得到了一个看起来像这样的自定义方面,并且能够在运行时通过反射检测到:
[Serializable]
[MulticastAttributeUsage(PersistMetaData = true)]
internal class AffectsProgress : OnMethodBoundaryAspect
{
public override void OnExit(MethodExecutionArgs args)
{
// do all my progress-related stuff here
}
}
答案 0 :(得分:2)
默认情况下,多播属性在多播阶段被删除,并且所有实例(如果您对所有方法进行多播,可能会有很多实例)在内部传递给Aspect Framework。
您可以告诉多播引擎不要删除元数据,以便您可以在运行时访问该属性。这是这样做的:
[MulticastAttributeUsage(PersistMetaData = true)]
Aspect属性将出现在已应用它们的声明上(即MethodLevelAspect on methods,TypeLevel aspect on types等)。
答案 1 :(得分:1)
方面被PostSharp编织为IL代码,因此在PostSharp完成后处理后,表示方面的属性已经消失。
ReflectionSearch应该有帮助(我从未尝试过),因为它说:
这些方法仅在构建时可用。
在构建时,这是在消失之前访问方面属性的最后机会。