From 812c108cd36fb5c059d5c0f3811979991a44b13b Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Thu, 30 Dec 2010 16:21:40 +0100 Subject: [PATCH] [LINQ] Fix non generic AsQueryable issue #661462 --- .../System.Linq.Expressions/Extensions.cs | 14 ++++++++++---- mcs/class/System.Core/System.Linq/Queryable.cs | 7 +++---- 2 files changed, 13 insertions(+), 8 deletions(-) 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 -- 2.25.1