/// <inheritdoc /> public override bool IsWeaveable(Type declaredType, Type targetType) { // В любом случае объявленный тип должен быть интерфейсом // это ограничение прокси-генератора, да и C#-а в целом if (!declaredType.IsInterface) { return(false); } if (!targetType.IsClass || targetType.IsAbstract) { return(false); } if (IsWeavingSuppressed(targetType)) { return(false); } var aspectSelector = AspectSelectorHolder.Get(); // На интерфейсе есть аспект if (aspectSelector.HasAnyAspect(targetType)) { return(true); } // На методах класса есть аспекты if (targetType.GetMethods().Any( m => !IsWeavingSuppressed(m) && aspectSelector.HasAnyAspect(m))) { return(true); } var baseTypes = targetType.GetInterceptableBaseTypes() .Where(t => !IsWeavingSuppressed(t)).ToArray(); // На базовых типах есть аспекты if (baseTypes.Any(t => aspectSelector.HasAnyAspect(t))) { return(true); } // На методах базового типа есть аспекты return(baseTypes.SelectMany(i => i.GetMethods()) .Any(m => !IsWeavingSuppressed(m) && aspectSelector.HasAnyAspect(m))); }
/// <inheritdoc /> public override bool IsWeaveable(IInvocationSignature signature) { if (!signature.DeclaringType.IsInterface) { return(false); } if (IsWeavingSuppressed(signature.Method)) { return(false); } var selector = AspectSelectorHolder.Get(); return(selector.HasAnyAspect(signature.Method) || IsWeaveable(signature.DeclaringType, signature.TargetType)); }
/// <inheritdoc /> public override bool IsWeaveable(Type declaredType, Type targetType) { if (!declaredType.IsInterface) { return(false); } if (IsWeavingSuppressed(declaredType)) { return(false); } var selector = AspectSelectorHolder.Get(); // На интерфейсе есть аспект if (selector.HasAnyAspect(declaredType)) { return(true); } // На методах интерфейса есть аспекты if (declaredType.GetMethods().Any(m => !IsWeavingSuppressed(m) && selector.HasAnyAspect(m))) { return(true); } var interaces = declaredType.GetInterfaces().Where(i => !IsWeavingSuppressed(i)).ToArray(); // На базовом интерфейсе есть аспект if (interaces.Any(i => selector.HasAnyAspect(i))) { return(true); } // На методах базового интерфейса есть аспекты return(interaces.SelectMany(i => i.GetMethods()) .Any(m => !IsWeavingSuppressed(m) && selector.HasAnyAspect(m))); }