public static GenericInstanceType InflateType(GenericContext context, GenericInstanceType genericInstanceType) { return ConstructGenericType(context, genericInstanceType.Resolve(), genericInstanceType.GenericArguments); }
public static MethodReference NormalizeMethod(GenericInstanceType declaringType, MethodReference methodRef) { var typeDef = declaringType.Resolve(); var genericTypesByName = new Dictionary<string, TypeReference>(); for (int i = 0; i < declaringType.GenericArguments.Count; i++) { var genericArgument = declaringType.GenericArguments[i]; var genericParameter = typeDef.GenericParameters[i]; genericTypesByName.Add(genericParameter.Name, genericArgument); } var returnType = methodRef.ReturnType; if (returnType is GenericParameter) { // try to resolve the type based on the context of the declaringType returnType = genericTypesByName[returnType.Name]; } var reference = new MethodReference(methodRef.Name, returnType); reference.DeclaringType = methodRef.DeclaringType; foreach (ParameterDefinition parameter in methodRef.Parameters) { var parameterType = parameter.ParameterType; var genericParameter = parameterType as GenericParameter; if (genericParameter != null) { TypeReference found; if (genericTypesByName.TryGetValue(genericParameter.Name, out found)) { parameterType = found; } } reference.Parameters.Add(new ParameterDefinition(parameterType)); } return reference; }