public static MethodInfo GetMethod(this Type This, string methodName, Type[] paramTypes, BindingFlags flags = default(BindingFlags)) { var ti = This.GetTypeInfo(); var ret = ti.GetDeclaredMethods(methodName) .FirstOrDefault(x => { return paramTypes.Zip(x.GetParameters().Select(y => y.ParameterType), (l, r) => l == r).All(y => y != false); }); if (ret != null || !flags.HasFlag(BindingFlags.FlattenHierarchy) || ti.BaseType == null) return ret; return ti.BaseType.GetMethod(methodName, paramTypes, flags); }
public static void AddMethodTranslator(Type declaringType, string methodName, IJsMethodTranslator translator, Type[] parameters = null) { var methods = declaringType.GetMethods() .Where(m => m.Name == methodName); if (parameters != null) { methods = methods.Where(m => { var mp = m.GetParameters(); return mp.Length == parameters.Length && parameters.Zip(mp, (specified, method) => method.ParameterType.IsAssignableFrom(specified)).All(t => t); }); } AddMethodTranslator(methods.Single(), translator); }