コード例 #1
0
ファイル: TypeInference.cs プロジェクト: nickchal/pash
 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;
 }