private static MethodInfo Infer(MethodInfo genericMethod, ICollection<Type> typeParameters, IEnumerable<Type> typesOfMethodParameters, IEnumerable<Type> typesOfMethodArguments) { MethodInfo info2; using (tracer.TraceScope("Inferring type parameters for the following method: {0}", new object[] { genericMethod })) { if (PSTraceSourceOptions.WriteLine == (tracer.Options & PSTraceSourceOptions.WriteLine)) { object[] args = new object[] { string.Join(", ", (from t in typesOfMethodArguments select t.ToString()).ToArray<string>()) }; tracer.WriteLine("Types of method arguments: {0}", args); } TypeInference inference = new TypeInference(typeParameters); if (!inference.UnifyMultipleTerms(typesOfMethodParameters, typesOfMethodArguments)) { return null; } IEnumerable<Type> source = typeParameters.Select<Type, Type>(new Func<Type, Type>(inference.GetInferredType)); if (source.Any<Type>(inferredType => inferredType == null)) { info2 = null; } else { try { MethodInfo info = genericMethod.MakeGenericMethod(source.ToArray<Type>()); tracer.WriteLine("Inference succesful: {0}", new object[] { info }); info2 = info; } catch (ArgumentException exception) { tracer.WriteLine("Inference failure: {0}", new object[] { exception.Message }); info2 = null; } } } return info2; }