private bool TrySubstitute([NotNull] TypeReference typeRef, [NotNull] ISubstitutionMap substitutionMap, [NotNull] Func <SubstitutionTarget, bool> doSubstitution, out TypeReference substituted) { if (substitutionMap.TryGetValue(typeRef, out var substitute)) { // ReSharper disable once AssignNullToNotNullAttribute if (doSubstitution.Invoke(substitute)) { substituted = _moduleDefinition.ImportReference(substitute.TargetType); return(true); } } if (typeRef is GenericInstanceType genericType) { // ReSharper disable once AssignNullToNotNullAttribute for (var i = 0; i < genericType.GenericArguments.Count; i++) { if (TrySubstitute(genericType.GenericArguments[i], substitutionMap, doSubstitution, out var substitutedGeneric)) { genericType.GenericArguments[i] = substitutedGeneric; } } } // ReSharper disable once PossibleNullReferenceException foreach (var genericParameter in typeRef.GenericParameters) { SubstituteSignature(genericParameter, substitutionMap); } if (_validatedTypes.Add(typeRef)) { if (_unmappedTypeErrors.TryGetValue(typeRef, out var error)) { throw error; } var substitutedBaseType = typeRef.GetBaseTypes().FirstOrDefault(baseType => _substitutionMap.ContainsKey(baseType)); if (substitutedBaseType != null) { throw new WeavingException($"{typeRef} is not substituted, but is derived from the substituted type {substitutedBaseType}. You must substitute {typeRef}, too.", typeRef); } } substituted = null; return(false); }