private MethodInfo Deserialize(ParsedMethodInfo parsedMethodInfo, Type reflectedType)
        {
            if (parsedMethodInfo == null)
            {
                throw new ArgumentNullException(nameof(parsedMethodInfo));
            }
            if (reflectedType == null)
            {
                throw new ArgumentNullException(nameof(reflectedType));
            }

            BindingFlags bindingFlags = (parsedMethodInfo.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic) |
                                        (parsedMethodInfo.IsStatic ? BindingFlags.Static : BindingFlags.Instance);

            Func <IEnumerable <ParameterInfo>, IEnumerable <ParsedParameterInfo>, bool> parametersMatch = (paramterInfos, parsedParameterInfos) =>
            {
                if (paramterInfos == null)
                {
                    throw new ArgumentNullException(nameof(paramterInfos));
                }
                if (parsedParameterInfos == null)
                {
                    throw new ArgumentNullException(nameof(parsedParameterInfos));
                }

                if (paramterInfos.Count() != parsedParameterInfos.Count())
                {
                    return(false);
                }

                for (int i = 0; i < paramterInfos.Count(); i++)
                {
                    ParameterInfo       parameterInfo       = paramterInfos.ElementAt(i);
                    ParsedParameterInfo parsedParameterInfo = parsedParameterInfos.ElementAt(i);

                    if (parameterInfo.Name != parsedParameterInfo.Name)
                    {
                        return(false);
                    }

                    Type source = parsedParameterInfo.ParameterType == null ? null : Deserialize(parsedParameterInfo.ParameterType);
                    if (parameterInfo.ParameterType != source)
                    {
                        Type parameterInfo2 = parameterInfo.ParameterType.IsGenericType ? parameterInfo.ParameterType.GetGenericTypeDefinition() : parameterInfo.ParameterType;
                        Type source2        = source.IsGenericType ? source.GetGenericTypeDefinition() : source;

                        if (parameterInfo2 != source2)
                        {
                            return(false);
                        }
                    }
                }

                return(true);
            };
            Func <IEnumerable <Type>, IEnumerable <ParsedType>, bool> genericArgumentsMatch = (types, parsedTypes) =>
            {
                if (types == null)
                {
                    throw new ArgumentNullException(nameof(types));
                }
                if (parsedTypes == null)
                {
                    throw new ArgumentNullException(nameof(parsedTypes));
                }

                if (types.Count() != parsedTypes.Count())
                {
                    return(false);
                }

                return(true);
            };

            MethodInfo methodInfo = reflectedType.GetMethods(bindingFlags)
                                    .Where(_ => _.Name == parsedMethodInfo.Name &&
                                           _.ReturnType == (parsedMethodInfo.ReturnType == null ? null : Deserialize(parsedMethodInfo.ReturnType)) &&
                                           parametersMatch(_.GetParameters(), parsedMethodInfo.Parameters) &&
                                           genericArgumentsMatch(_.GetGenericArguments(), parsedMethodInfo.GenericArguments))
                                    .SingleOrDefault();

            if (methodInfo != null && methodInfo.GetGenericArguments().Length > 0)
            {
                methodInfo = methodInfo.MakeGenericMethod(parsedMethodInfo.GenericArguments.Select(Deserialize).ToArray());
            }

            return(methodInfo);
        }
        private ConstructorInfo Deserialize(ParsedConstructorInfo parsedConstructorInfo, Type reflectedType)
        {
            if (parsedConstructorInfo == null)
            {
                throw new ArgumentNullException(nameof(parsedConstructorInfo));
            }
            if (reflectedType == null)
            {
                throw new ArgumentNullException(nameof(reflectedType));
            }

            BindingFlags bindingFlags = (parsedConstructorInfo.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic);

            Func <IEnumerable <ParameterInfo>, IEnumerable <ParsedParameterInfo>, bool> parametersMatch = (paramterInfos, parsedParameterInfos) =>
            {
                if (paramterInfos == null)
                {
                    throw new ArgumentNullException(nameof(paramterInfos));
                }
                if (parsedParameterInfos == null)
                {
                    throw new ArgumentNullException(nameof(parsedParameterInfos));
                }

                if (paramterInfos.Count() != parsedParameterInfos.Count())
                {
                    return(false);
                }

                for (int i = 0; i < paramterInfos.Count(); i++)
                {
                    ParameterInfo       parameterInfo       = paramterInfos.ElementAt(i);
                    ParsedParameterInfo parsedParameterInfo = parsedParameterInfos.ElementAt(i);

                    if (parameterInfo.Name != parsedParameterInfo.Name)
                    {
                        return(false);
                    }

                    Type source = parsedParameterInfo.ParameterType == null ? null : Deserialize(parsedParameterInfo.ParameterType);
                    if (parameterInfo.ParameterType != source)
                    {
                        Type parameterInfo2 = parameterInfo.ParameterType.IsGenericType ? parameterInfo.ParameterType.GetGenericTypeDefinition() : parameterInfo.ParameterType;
                        Type source2        = source.IsGenericType ? source.GetGenericTypeDefinition() : source;

                        if (parameterInfo2 != source2)
                        {
                            return(false);
                        }
                    }
                }

                return(true);
            };
            Func <IEnumerable <Type>, IEnumerable <ParsedType>, bool> genericArgumentsMatch = (types, parsedTypes) =>
            {
                if (types == null)
                {
                    throw new ArgumentNullException(nameof(types));
                }
                if (parsedTypes == null)
                {
                    throw new ArgumentNullException(nameof(parsedTypes));
                }

                if (types.Count() != parsedTypes.Count())
                {
                    return(false);
                }

                return(true);
            };

            return(reflectedType.GetConstructors(bindingFlags)
                   .Where(_ => _.Name == parsedConstructorInfo.Name &&
                          parametersMatch(_.GetParameters(), parsedConstructorInfo.Parameters) &&
                          genericArgumentsMatch(_.GetGenericArguments(), parsedConstructorInfo.GenericArguments))
                   .SingleOrDefault());
        }