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()); }