/// <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)));
        }