【问题标题】:PostSharp How to know at runtime if a certain aspect was applied to a method?PostSharp 如何在运行时知道某个方面是否应用于方法?
【发布时间】: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


【解决方案1】:

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

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

[MulticastAttributeUsage( PersistMetaData = true )]
public class MyAspect : OnExceptionAspect
{
    // ...
}

现在您可以在MethodBase.CustomAttributes 中查找MyAspect 以确定该方面是否已应用于当前方法。

【讨论】:

  • 在我的情况下给任何人的快速说明 - 该属性永远不会保留在类本身上,只保留在 in 中的方法上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多