예제 #1
0
            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);
            }