我最近开始将PostSharp用于我们的一个项目。目的是记录在特定方法中调用的所有方法的方法执行时间(表示特定功能)。
我到目前为止所做的是我创建了一个方面(比如TimingAspect)并在一个方法上测试它(通过在方法定义上面写'[TimingAspect]')。它工作正常,将该方法的执行时间记录在一个单独的日志文件中。
据我所知,如果我在方法定义之上编写'[TimingAspect]',它只记录该方法,而不是从该方法调用的其他方法。我对吗 ?所以现在我想知道是否有任何方法可以实现目标,即在特定方法中调用的所有方法的日志方法执行时间?
答案 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);
}
}
}
}
请注意,这不包括从被调用方法调用的方法的日志记录等。我的理解是你想要记录直接从目标方法调用的方法。