private Message TryParseEnum <TParse>(ReflectedParserSettings parserSettings, string text, out TParse result) where TParse : struct { if (Enum.TryParse(text, parserSettings.EnumIgnoreCase, out result)) { return(Message.NoError); } else if (parserSettings.UseParserMessage) { return(new Message($"The value {text} is not defined for the enum {typeof(TParse).Name}.")); } else { return(parserSettings.TypeErrorMessage(text)); } }
private Message TryParse <TParse>(ReflectedParserSettings parserSettings, string text, out TParse result) { if (typeof(TParse) == typeof(string)) { result = (TParse)(object)text; return(Message.NoError); } else if (Nullable.GetUnderlyingType(typeof(TParse)) != null) { var nullableType = Nullable.GetUnderlyingType(typeof(TParse)); var nullableMethod = GetType() .GetTypeInfo() .GetDeclaredMethod(nameof(TryParseNullable)) .MakeGenericMethod(nullableType); var arrMethodArgs = new object[3]; arrMethodArgs[0] = parserSettings; arrMethodArgs[1] = text; var msg = nullableMethod.Invoke(this, arrMethodArgs); result = (TParse)arrMethodArgs[2]; return((Message)msg); } else if (typeof(TParse).GetTypeInfo().IsEnum) { var nullableMethod = GetType() .GetTypeInfo() .GetDeclaredMethod(nameof(TryParseEnum)) .MakeGenericMethod(typeof(TParse)); var arrMethodArgs = new object[3]; arrMethodArgs[0] = parserSettings; arrMethodArgs[1] = text; var msg = nullableMethod.Invoke(this, arrMethodArgs); result = (TParse)arrMethodArgs[2]; return((Message)msg); } else if (TryGetMessageTryParse <TParse>(out var messageParser)) { Message msg = messageParser(text, out result); if (msg.IsError && !parserSettings.UseParserMessage) { return(parserSettings.TypeErrorMessage(text)); } else { return(msg); } } else if (TryGetTryParse <TParse>(out var simpleParser)) { bool parsed = simpleParser(text, out result); if (!parsed) { return(parserSettings.TypeErrorMessage(text)); } else { return(Message.NoError); } } else { throw new MissingParserException(typeof(TParse)); } }