# HG changeset patch # User Steven Robbins # Date 1295099903 0 # Node ID aafb438ec863d4bfbd4745dc7041a1ea5033895f # Parent 236f600b24df9c18eef0faf78aafd19189361cdf Re-worked GetGenericMethod to use a less efficient version on PocketPC to workaround a reflection limitation. diff -r 236f600b24df9c18eef0faf78aafd19189361cdf -r aafb438ec863d4bfbd4745dc7041a1ea5033895f src/TinyIoC/TinyIoC.cs --- a/src/TinyIoC/TinyIoC.cs Sat Jan 15 13:28:42 2011 +0000 +++ b/src/TinyIoC/TinyIoC.cs Sat Jan 15 13:58:23 2011 +0000 @@ -166,6 +166,7 @@ /// public static MethodInfo GetGenericMethod(this Type sourceType, System.Reflection.BindingFlags bindingFlags, string methodName, Type[] genericTypes, Type[] parameterTypes) { +#if GETPARAMETERS_OPEN_GENERICS var methods = sourceType.GetMethods(bindingFlags) .Where(mi => string.Equals(methodName, mi.Name, StringComparison.InvariantCulture)) .Where(mi => mi.ContainsGenericParameters) @@ -174,13 +175,24 @@ .Select(mi => mi.MakeGenericMethod(genericTypes)) .Where(mi => mi.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(parameterTypes)) .ToList(); - +#else + var validMethods = from method in sourceType.GetMethods(bindingFlags) + where method.Name == methodName + where method.IsGenericMethod + where method.GetGenericArguments().Length == genericTypes.Length + let genericMethod = method.MakeGenericMethod(genericTypes) + where genericMethod.GetParameters().Count() == parameterTypes.Length + where genericMethod.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(parameterTypes) + select genericMethod; + + var methods = validMethods.ToList(); +#endif if (methods.Count > 1) throw new AmbiguousMatchException(); - var method = methods.FirstOrDefault(); - - return method; + var actualMethod = methods.FirstOrDefault(); + + return actualMethod; } } #endregion @@ -2899,25 +2911,27 @@ #endif private object GetIEnumerableRequest(Type type) { -#if GETPARAMETERS_OPEN_GENERICS - // Using MakeGenericMethod (slow) because we need to - // cast the IEnumerable or constructing the type wil fail. - // We may as well use the ResolveAll public - // method to do this. - var resolveAllMethod = this.GetType().GetMethod("ResolveAll", new Type[] { }); - var genericResolveAllMethod = resolveAllMethod.MakeGenericMethod(type.GetGenericArguments()[0]); -#else - var resolveAllMethods = from member in this.GetType().GetMembers() - where member.MemberType == MemberTypes.Method - where member.Name == "ResolveAll" - let method = member as MethodInfo - where method.IsGenericMethod - let genericMethod = method.MakeGenericMethod(type.GetGenericArguments()[0]) - where genericMethod.GetParameters().Count() == 0 - select genericMethod; - - var genericResolveAllMethod = resolveAllMethods.First(); -#endif + var genericResolveAllMethod = this.GetType().GetGenericMethod(BindingFlags.Public | BindingFlags.Instance, "ResolveAll", type.GetGenericArguments(), new Type[] { }); + +//#if GETPARAMETERS_OPEN_GENERICS +// // Using MakeGenericMethod (slow) because we need to +// // cast the IEnumerable or constructing the type wil fail. +// // We may as well use the ResolveAll public +// // method to do this. +// var resolveAllMethod = this.GetType().GetMethod("ResolveAll", new Type[] { }); +// var genericResolveAllMethod = resolveAllMethod.MakeGenericMethod(type.GetGenericArguments()[0]); +//#else +// var resolveAllMethods = from member in this.GetType().GetMembers() +// where member.MemberType == MemberTypes.Method +// where member.Name == "ResolveAll" +// let method = member as MethodInfo +// where method.IsGenericMethod +// let genericMethod = method.MakeGenericMethod(type.GetGenericArguments()[0]) +// where genericMethod.GetParameters().Count() == 0 +// select genericMethod; + +// var genericResolveAllMethod = resolveAllMethods.First(); +//#endif return genericResolveAllMethod.Invoke(this, new object[] { }); }