# 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[] { });
}