Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PostSharp如何在运行时知道某个方面是否应用于某个方法?_C#_.net_Reflection_Aop_Postsharp - Fatal编程技术网

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

C# PostSharp如何在运行时知道某个方面是否应用于某个方法?,c#,.net,reflection,aop,postsharp,C#,.net,Reflection,Aop,Postsharp,我正在实现PostSharp方面库,无法找到以下问题的解决方案 假设我们有一个方面将应用于某些方法,而不会应用于其他方法。我需要一些机制,可以在运行时使用这些机制来了解方面是否应用于方法。具体地说,在运行时确定某个方面是否应用于System.Reflection.MethodBase给出的特定方法的推荐方法是什么? 我想到的第一个解决方案是使用自定义atribute对每个经过此方面修改的方法进行PostSharp标记,并在运行时使用methodBase.CustomAttributes。这是解决

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

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

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


另外,请考虑到首选的解决方案不需要付费PostSharp许可证,因为免费社区版对于我当前的项目来说已经足够了。无论如何,讨论基于付费PostSharp功能的解决方案也是非常有趣的。

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

通过将属性设置为true,可以告诉PostSharp保留所有方面属性。该属性必须应用于方面类

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

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

我们讨论的是哪种aspect?例如,如果您从methodInterceptionAttribute继承,那么您可以将[MyAttribute]添加到该方法,它将仅应用于您指定的方法。这是否足够?postsharp在编译时应用属性。为什么您需要在运行时确定是否应用了某个属性。@Batavia,我目前的情况是关于
OneExceptionSpect
,但我想知道如何实现特定方面类型的regerdless。有
PostSharp.Post.IsTransformed
可在运行时确定程序集是否已转换。我正在搜索类似的内容,但只搜索单个方法。@然而,巴达维亚,您能指出一种解决方案,专门使用
methodinterceptionspect
标记具有属性的方法吗?例如,我所能找到的就是如何使用IAspectProvider注入属性。此外,这种方法需要PostSharp的付费复合属性特性。@Batavia,回答您的第二条评论,我正在实现的aspects库的一个用例是,当发生异常时,我需要记录完整的堆栈跟踪,记录由我的方面转换的每个方法的参数值,跳过堆栈跟踪中的其他方法