PostSharp如何在运行时知道某个方面是否应用于某个方法?

Ale*_*mov 4 .net c# reflection aop postsharp

我正在实现PostSharp方面库,无法找到解决以下问题的方法.

假设我们有一个方面将应用于某些方法,而不会应用于其他方法.我需要一些机制,我可以在运行时使用它来知道方面是否应用于方法.具体来说,在运行时确定某个方面是否应用于某个特定方法的推荐方法是System.Reflection.MethodBase什么?

我想到的第一个解决方案是使用自定义属性methodBase.CustomAttributes在运行时使用PostSharp标记已由此方面修改的每个方法.这是解决问题的正确方法吗?或者在PostSharp中已经有一个现成的或更优雅的解决方案.

此外,请注意首选是一种不需要付费PostSharp许可证的解决方案,因为Free Community Edition足以支持我当前的项目.无论如何,讨论基于付费PostSharp功能的解决方案也是非常有意义的.

Ale*_*exD 5

当您在类或程序集级别添加方法级方面(例如OnExceptionAspect)作为属性时,PostSharp会将此属性多播到该类/程序集中的所有适用方法.在下一阶段,方面使用属性转换每个方法,并删除属性本身.

您可以通过将MulticastAttributeUsageAttribute.PersistMetaData属性设置为true来告诉PostSharp保留所有方面属性.该[MulticastAttributeUsage]属性必须应用于方面类.

[MulticastAttributeUsage( PersistMetaData = true )]
public class MyAspect : OnExceptionAspect
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在,你可以看看MyAspectMethodBase.CustomAttributes确定方面是否已经被应用到当前的方法.

  • 在我的情况下,任何人都可以快速记录 - 该属性永远不会保留在类本身上,只保留在其中的方法中 (2认同)