From: Jb Evain Date: Thu, 30 Dec 2010 15:21:40 +0000 (+0100) Subject: [LINQ] Fix non generic AsQueryable issue #661462 X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=812c108cd36fb5c059d5c0f3811979991a44b13b;p=mono.git [LINQ] Fix non generic AsQueryable issue #661462 --- diff --git a/mcs/class/System.Core/System.Linq.Expressions/Extensions.cs b/mcs/class/System.Core/System.Linq.Expressions/Extensions.cs index 28fb99a49f9..3af0f5210f7 100644 --- a/mcs/class/System.Core/System.Linq.Expressions/Extensions.cs +++ b/mcs/class/System.Core/System.Linq.Expressions/Extensions.cs @@ -53,11 +53,17 @@ namespace System.Linq.Expressions { return self == typeof (Expression) || self.IsSubclassOf (typeof (Expression)); } - public static bool IsGenericImplementationOf (this Type self, Type type) + public static bool IsGenericImplementationOf (this Type self, Type type, out Type generic_iface) { - foreach (Type iface in self.GetInterfaces ()) - if (iface.IsGenericInstanceOf (type)) - return true; + foreach (var iface in self.GetInterfaces ()) { + if (!iface.IsGenericInstanceOf (type)) + continue; + + generic_iface = iface; + return true; + } + + generic_iface = null; return false; } diff --git a/mcs/class/System.Core/System.Linq/Queryable.cs b/mcs/class/System.Core/System.Linq/Queryable.cs index 8c4a68fdb59..b2fedba0c2f 100644 --- a/mcs/class/System.Core/System.Linq/Queryable.cs +++ b/mcs/class/System.Core/System.Linq/Queryable.cs @@ -158,13 +158,12 @@ namespace System.Linq { if (queryable != null) return queryable; - var type = source.GetType (); - - if (!type.IsGenericImplementationOf (typeof (IEnumerable<>))) + Type ienumerable; + if (!source.GetType ().IsGenericImplementationOf (typeof (IEnumerable<>), out ienumerable)) throw new ArgumentException ("source is not IEnumerable<>"); return (IQueryable) Activator.CreateInstance ( - typeof (QueryableEnumerable<>).MakeGenericType (type.GetFirstGenericArgument ()), source); + typeof (QueryableEnumerable<>).MakeGenericType (ienumerable.GetFirstGenericArgument ()), source); } #endregion