From 68acf2694de0967d966421ab301ad7d45be533e6 Mon Sep 17 00:00:00 2001 From: Another Developer Date: Thu, 27 Oct 2016 17:56:27 -0400 Subject: [PATCH] Fix Event Bus for null exception (#7360) EventsInterceptor fails when it tries to locate a generic method on an implementation with a return type. A null check has been added to avoid the exception. Fixes #4718 Dixes #4584 --- src/Orchard/Events/EventsInterceptor.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Orchard/Events/EventsInterceptor.cs b/src/Orchard/Events/EventsInterceptor.cs index 45497f9d0..21e9e3ec9 100644 --- a/src/Orchard/Events/EventsInterceptor.cs +++ b/src/Orchard/Events/EventsInterceptor.cs @@ -39,18 +39,23 @@ namespace Orchard.Events { // static IEnumerable IEnumerable.OfType(this IEnumerable source) // where T is from returnType's IEnumerable var enumerableOfTypeT = _enumerableOfTypeTDictionary.GetOrAdd( returnType, type => typeof(Enumerable).GetGenericMethod("OfType", type.GetGenericArguments(), new[] { typeof(IEnumerable) }, typeof(IEnumerable<>))); - return enumerableOfTypeT.Invoke(null, new[] { results }); + return (enumerableOfTypeT != null) ? enumerableOfTypeT.Invoke(null, new[] { results }) : null; + } } public static class Extensions { public static MethodInfo GetGenericMethod(this Type t, string name, Type[] genericArgTypes, Type[] argTypes, Type returnType) { - return (from m in t.GetMethods(BindingFlags.Public | BindingFlags.Static) - where m.Name == name && - m.GetGenericArguments().Length == genericArgTypes.Length && - m.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(argTypes) && - (m.ReturnType.IsGenericType && !m.ReturnType.IsGenericTypeDefinition ? returnType.GetGenericTypeDefinition() : m.ReturnType) == returnType - select m).Single().MakeGenericMethod(genericArgTypes); + var method = (from m in t.GetMethods(BindingFlags.Public | BindingFlags.Static) + where m.Name == name && + m.GetGenericArguments().Length == genericArgTypes.Length && + m.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(argTypes) && + (m.ReturnType.IsGenericType && !m.ReturnType.IsGenericTypeDefinition ? returnType.GetGenericTypeDefinition() : m.ReturnType) == returnType + select m).SingleOrDefault(); + if (method != null) { + return method.MakeGenericMethod(genericArgTypes); + } + return null; } }