IAspectProvider을 구현하여 대상 메서드에서 호출 한 메서드에 애스펙트를 적용 할 수 있습니다. 호출 된 모든 메소드를 찾으려면 PostSharp API의 ReflectionSearch 클래스를 사용할 수 있습니다.
아래에서 그러한 aspect 제공자의 예를 찾을 수 있습니다.
[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);
}
}
}
}
호출 된 메소드 등에서 호출 된 메소드에 대한 로깅은 다루지 않습니다. 내 이해는 대상 메서드에서 직접 호출되는 메서드를 기록하려고합니다.