/// <summary> /// Attempts to find an extension method that matches the name and arguments based on scanning the Type's passed in /// to the findMethodsOnTypes parameter /// </summary> /// <param name="thisObject">The instance object to execute the extension method for</param> /// <param name="args"></param> /// <param name="name"></param> /// <param name="findMethodsOnTypes"></param> /// <returns></returns> internal static object FindAndExecuteExtensionMethod <T>(T thisObject, object[] args, string name, IEnumerable <Type> findMethodsOnTypes) { object result = null; //find known extension methods that match the first type in the list MethodInfo toExecute = null; foreach (var t in findMethodsOnTypes) { toExecute = ExtensionMethodFinder.FindExtensionMethod(t, args, name, false); if (toExecute != null) { break; } } if (toExecute != null) { var genericArgs = (new[] { (object)thisObject }).Concat(args); result = toExecute.Invoke(null, genericArgs.ToArray()); } else { throw new MissingMethodException(); } return(result); }
/// <summary> /// Attempts to find an extension method that matches the name and arguments based on scanning the Type's passed in /// to the findMethodsOnTypes parameter /// </summary> /// <param name="runtimeCache"></param> /// <param name="thisObject">The instance object to execute the extension method for</param> /// <param name="args"></param> /// <param name="name"></param> /// <param name="findMethodsOnTypes"></param> /// <returns></returns> internal static object FindAndExecuteExtensionMethod <T>( IRuntimeCacheProvider runtimeCache, T thisObject, object[] args, string name, IEnumerable <Type> findMethodsOnTypes) { object result = null; //find known extension methods that match the first type in the list MethodInfo toExecute = null; foreach (var t in findMethodsOnTypes) { toExecute = ExtensionMethodFinder.FindExtensionMethod(runtimeCache, t, args, name, false); if (toExecute != null) { break; } } if (toExecute != null) { var genericArgs = (new[] { (object)thisObject }).Concat(args); // else we'd get an exception w/ message "Late bound operations cannot // be performed on types or methods for which ContainsGenericParameters is true." // because MakeGenericMethod must be used to obtain an actual method that can run if (toExecute.ContainsGenericParameters) { throw new InvalidOperationException("Method contains generic parameters, something's wrong."); } result = toExecute.Invoke(null, genericArgs.ToArray()); } else { throw new MissingMethodException(typeof(T).FullName, name); } return(result); }