如何为特定方法中调用的所有方法启用PostSharp?

时间:2017-02-24 10:27:55

标签: c# logging aop postsharp aspect

我最近开始将PostSharp用于我们的一个项目。目的是记录在特定方法中调用的所有方法的方法执行时间(表示特定功能)。

我到目前为止所做的是我创建了一个方面(比如TimingAspect)并在一个方法上测试它(通过在方法定义上面写'[TimingAspect]')。它工作正常,将该方法的执行时间记录在一个单独的日志文件中。

据我所知,如果我在方法定义之上编写'[TimingAspect]',它只记录该方法,而不是从该方法调用的其他方法。我对吗 ?所以现在我想知道是否有任何方法可以实现目标,即在特定方法中调用的所有方法的日志方法执行时间

1 个答案:

答案 0 :(得分:0)

您可以通过实施IAspectProvider将您的方面应用于从目标方法调用的方法。要查找所有调用的方法,可以使用PostSharp API中的ReflectionSearch类。

您可以在下面找到此类方面提供程序的示例。

[PSerializable]
public class TimingAspectProvider : MethodLevelAspect, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        MethodBase targetMethod = (MethodBase) targetElement;

        IAspectRepositoryService aspectRepositoryService = PostSharpEnvironment.CurrentProject.GetService<IAspectRepositoryService>();
        TimingAspect aspect = new TimingAspect();

        MethodUsageCodeReference[] usages = ReflectionSearch.GetDeclarationsUsedByMethod(targetMethod);
        foreach (MethodUsageCodeReference codeReference in usages.Where(u => u.UsedDeclaration.MemberType == MemberTypes.Method))
        {
            if (!aspectRepositoryService.HasAspect(codeReference.UsedDeclaration, typeof(TimingAspect)))
            {
                yield return new AspectInstance(codeReference.UsedDeclaration, aspect);
            }
        }
    }
}

请注意,这不包括从被调用方法调用的方法的日志记录等。我的理解是你想要记录直接从目标方法调用的方法。