static GenericInstanceType ResolveIfNeeded(IGenericInstance genericInstanceMethod, IGenericInstance genericInstanceType, GenericInstanceType genericInstanceType1) { if (!genericInstanceType1.ContainsGenericParameters()) { return(genericInstanceType1); } var newGenericInstance = new GenericInstanceType(genericInstanceType1.ElementType); foreach (var genericArgument in genericInstanceType1.GenericArguments) { if (!genericArgument.IsGenericParameter) { newGenericInstance.GenericArguments.Add(ResolveIfNeeded(genericInstanceMethod, genericInstanceType, genericArgument)); continue; } var genParam = (GenericParameter)genericArgument; switch (genParam.Type) { case GenericParameterType.Type: { if (genericInstanceType == null) { throw new NotSupportedException(); } newGenericInstance.GenericArguments.Add(genericInstanceType.GenericArguments[genParam.Position]); } break; case GenericParameterType.Method: { if (genericInstanceMethod == null) { newGenericInstance.GenericArguments.Add(genParam); } else { newGenericInstance.GenericArguments.Add(genericInstanceMethod.GenericArguments[genParam.Position]); } } break; } } return(newGenericInstance); }
private static GenericInstanceType ResolveIfNeeded(IGenericInstance genericInstanceMethod, IGenericInstance genericInstanceType, GenericInstanceType genericInstanceType1) { if (!genericInstanceType1.ContainsGenericParameters()) { return(genericInstanceType1); } GenericInstanceType type2 = new GenericInstanceType(genericInstanceType1.ElementType); foreach (TypeReference reference in genericInstanceType1.GenericArguments) { if (!reference.IsGenericParameter) { type2.GenericArguments.Add(ResolveIfNeeded(genericInstanceMethod, genericInstanceType, reference)); } else { GenericParameter item = (GenericParameter)reference; switch (item.Type) { case GenericParameterType.Type: if (genericInstanceType == null) { throw new NotSupportedException(); } type2.GenericArguments.Add(genericInstanceType.GenericArguments[item.Position]); break; case GenericParameterType.Method: if (genericInstanceMethod == null) { type2.GenericArguments.Add(item); } else { type2.GenericArguments.Add(genericInstanceMethod.GenericArguments[item.Position]); } break; } } } return(type2); }