Ejemplo n.º 1
0
 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));
     }
 }
Ejemplo n.º 2
0
        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));
            }
        }