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