private static Delegate DiscoverParser <T, TParser>(string parserName) where TParser : Delegate { var parserInfo = typeof(TParser).GetMethod("Invoke"); var parserSignature = new MethodSignature(parserInfo, parserName, MethodAttributes.Public | MethodAttributes.Static); var type = typeof(T); var parserCandidates = type.GetMethods(BindingFlags.Public | BindingFlags.Static).Where(x => x.Name == parserName); var parsers = parserCandidates. Where(x => parserSignature.IsCompatibelWith(x)). Select(x => (Method: x, ParameterCount: x.GetParameters().Length)). OrderBy(x => x.ParameterCount); var firstParameter = parsers.FirstOrDefault(); if (firstParameter.Equals(default))