【发布时间】:2015-02-25 21:49:02
【问题描述】:
我正在实现 PostSharp 方面库,但找不到以下问题的解决方案。
假设我们有一个方面将应用于某些方法而不会应用于其他方法。我需要一些可以在运行时使用的机制来了解某个方面是否应用于方法。具体来说,在运行时确定某个方面是否应用于System.Reflection.MethodBase 给出的特定方法的推荐方法是什么?
我想到的第一个解决方案是让 PostSharp 使用自定义属性标记已被此方面修改的每个方法,并在运行时使用 methodBase.CustomAttributes。这是解决问题的正确方法吗?或者也许 PostSharp 中已经有一个现成的或更优雅的解决方案。
另外,请注意首选的解决方案不需要付费 PostSharp 许可证,因为免费社区版足以满足我当前的项目。无论如何,讨论基于付费 PostSharp 功能的解决方案也会非常有趣。
【问题讨论】:
-
我们在谈论什么样的方面?例如,如果您从 methodInterceptionAttribute 继承,那么您可以将 [MyAttribute] 添加到方法中,它将仅应用于您指定的方法。这样就够了吗?
-
postsharp 应用属性编译时间。为什么需要在运行时确定是否已应用属性。
-
@Batavia,我目前的情况是关于
OnExceptionAspect,但我想知道如何实现这个与特定方面类型无关的。有PostSharp.Post.IsTransformed在运行时确定是否已转换程序集。我正在寻找类似的东西,但要寻找单一的方法。 -
@Batavia,但是,您能否指出一个解决方案,专门使用
MethodInterceptionAspect标记具有属性的方法?我所能找到的只是如何使用 IAspectProvider 注入属性,例如this。此外,这种方法需要 PostSharp 的付费 Composite Attribute 功能。 -
@Batavia,回答您的第二条评论,我正在实现的方面库的用例之一是,当发生异常时,我需要使用每个方法的参数值记录完整的堆栈跟踪这是由于我的方面跳过堆栈跟踪中的其他方法而改变的。
标签: c# .net reflection aop postsharp