【问题标题】:How to enable PostSharp for all methods called within a specific method?如何为特定方法中调用的所有方法启用 PostSharp?
【发布时间】:2017-02-28 19:20:38
【问题描述】:

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

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

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

【问题讨论】:

  • @Ronit Singh:你找到解决方案了吗?

标签: c# logging aop postsharp aspect


【解决方案1】:

您可以通过实现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);
            }
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多