gpt4 book ai didi

c# - 反射以查找应用了 PostSharp 方面的所有方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:37 25 4
gpt4 key购买 nike

我创建了一个 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 本身获得我正在寻找的东西的方法吗?我遇到了ReflectionSearchIAspectRepositoryService这需要终极版,但我不确定这些是否足够。

编辑:由@Daniel Balas 解决。使用该答案和我找到的信息 here我最终得到了一个看起来像这样的自定义方面,并且能够在运行时通过反射检测到:

    [Serializable]
[MulticastAttributeUsage(PersistMetaData = true)]
internal class AffectsProgress : OnMethodBoundaryAspect
{
public override void OnExit(MethodExecutionArgs args)
{
// do all my progress-related stuff here
}
}

最佳答案

多播属性在多播阶段默认被删除,并且所有实例(如果您将多播到所有方法,则可能有很多)在内部传递给 Aspect Framework。

您可以告诉多播引擎不要删除元数据,以便您可以在运行时访问该属性。这是这样做的:

[MulticastAttributeUsage(PersistMetaData = true)]

然后,方面属性将出现在应用它们的声明中(即方法上的 MethodLevelAspect,类型上的 TypeLevel 方面等)。

关于c# - 反射以查找应用了 PostSharp 方面的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com