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);
}
}
}
}
これは、呼び出されたメソッドなどから呼び出されるメソッドのログ記録には適用されません。私の理解では、ターゲットメソッドから直接呼び出されるメソッドをログに記録したいということです。