Exemplo n.º 1
0
        /// <summary>
        /// Determines whether the advice member is introduction, based on its type.
        /// </summary>
        /// <param name="adviceMemberTypeReference">The type reference.</param>
        /// <param name="introducedFieldType">Type of the introduced field.</param>
        /// <param name="isShared">if set to <c>true</c> the introduced field is shared among advices of the same type.</param>
        /// <param name="context">The context.</param>
        /// <returns>
        ///   <c>true</c> if the specified advice member type reference is introduction; otherwise, <c>false</c>.
        /// </returns>
        private bool IsIntroduction(ITypeDefOrRef adviceMemberTypeReference, out ITypeDefOrRef introducedFieldType, out bool isShared, WeavingContext context)
        {
            introducedFieldType = null;
            isShared            = false;
            var genericAdviceMemberTypeReference = adviceMemberTypeReference.TryGetGenericInstSig();

            if (genericAdviceMemberTypeReference is null)
            {
                return(false);
            }

            var genericAdviceMemberTypeDefinition = TypeResolver.Resolve(genericAdviceMemberTypeReference.GenericType.TypeDefOrRef);

            if (genericAdviceMemberTypeDefinition is null) // in DEBUG or bogus cases, this may not be resolved. Whatever, this is not our field
            {
                return(false);
            }

            if (!genericAdviceMemberTypeDefinition.ImplementsType(context.IntroducedFieldType, TypeResolver))
            {
                return(false);
            }

            introducedFieldType = genericAdviceMemberTypeReference.GenericArguments[0].ToTypeDefOrRef();
            isShared            = genericAdviceMemberTypeDefinition.ImplementsType(context.SharedIntroducedFieldType, TypeResolver);
            return(true);
        }
Exemplo n.º 2
0
        public static bool MatchInterfaceMethod(MethodDef?candidate, MethodDef?method, ITypeDefOrRef interfaceContextType)
        {
            var genericInstSig = interfaceContextType.TryGetGenericInstSig();

            if (!(genericInstSig is null))
            {
                return(MatchMethod(candidate, candidate?.MethodSig, method, GenericArgumentResolver.Resolve(method?.MethodSig, genericInstSig.GenericArguments, null)));
            }
        public static bool MatchInterfaceMethod(MethodDef candidate, MethodDef method, ITypeDefOrRef interfaceContextType)
        {
            var genericInstSig = interfaceContextType.TryGetGenericInstSig();

            if (genericInstSig != null)
            {
                return(MatchMethod(candidate, GenericArgumentResolver.Resolve(candidate.MethodSig, genericInstSig.GenericArguments, null), method));
            }
            else
            {
                return(MatchMethod(candidate, candidate.MethodSig, method));
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Determines whether the advice member is introduction, based on its type.
        /// </summary>
        /// <param name="adviceMemberTypeReference">The type reference.</param>
        /// <param name="introducedFieldType">Type of the introduced field.</param>
        /// <returns></returns>
        private static bool IsIntroduction(ITypeDefOrRef adviceMemberTypeReference, out ITypeDefOrRef introducedFieldType)
        {
            var genericAdviceMemberTypeReference = adviceMemberTypeReference.TryGetGenericInstSig();

            if (genericAdviceMemberTypeReference == null || genericAdviceMemberTypeReference.GenericType.FullName != typeof(IntroducedField <>).FullName)
            {
                introducedFieldType = null;
                return(false);
            }

            introducedFieldType = genericAdviceMemberTypeReference.GenericArguments[0].ToTypeDefOrRef();
            return(true);
        }
Exemplo n.º 5
0
 public static bool MatchInterfaceMethod(MethodDef candidate, MethodDef method, ITypeDefOrRef interfaceContextType)
 {
     var genericInstSig = interfaceContextType.TryGetGenericInstSig();
     if (genericInstSig != null) {
         return MatchMethod(candidate, GenericArgumentResolver.Resolve(candidate == null ? null : candidate.MethodSig, genericInstSig.GenericArguments, null), method);
     } else {
         return MatchMethod(candidate, candidate == null ? null : candidate.MethodSig, method);
     }
 }