コード例 #1
0
        public T GetParameter <T>(string parameterName, TryParseDelegate <T> tryParseDelegate)
        {
            byte tries   = 0;
            T    result  = default(T);
            bool success = false;

            do
            {
                Console.Write($"Please enter {parameterName}: ");
                string readValue = Console.ReadLine();
                success = tryParseDelegate(readValue, out result);
            } while (tries++ < MaxRetries && !success);

            return(result);
        }
コード例 #2
0
ファイル: ParseExtensions.cs プロジェクト: lulzzz/Boondocks
        private static T Parse <T>(string value, TryParseDelegate <T> tryParse)
            where T : struct
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                throw new ParseException("No value was provided.");
            }

            if (tryParse(value, out var parsed))
            {
                return(parsed);
            }

            throw new ParseException($"Unable to parse value '{value}' as '{typeof(T).Name}'.");
        }
コード例 #3
0
        private bool GetTagValue <T>(TestClassGenerationContext generationContext, Scenario scenario, string retryTag,
                                     TryParseDelegate <T> parser, out T value)
        {
            value = default(T);

            var tagNames = scenario.Tags?.Select(_ => _.GetNameWithoutAt()) ?? new string[0];

            tagNames = tagNames.ToList();
            string retryCountValue;

            return(_tagFilterMatcher.GetTagValue(retryTag, tagNames, out retryCountValue) &&
                   parser(retryCountValue, out value) ||
                   _tagFilterMatcher.GetTagValue(retryTag, generationContext.Document, out retryCountValue) &&
                   parser(retryCountValue, out value));
        }
コード例 #4
0
 public static GenericRouteParameterType Create <T>(string partRegex, TryParseDelegate <T> parser)
 {
     return(new GenericRouteParameterType(s => partRegex, (s, p) =>
     {
         T r;
         if (parser(s, out r))
         {
             return ParameterParseResult.Create((object)r);
         }
         else
         {
             return ParameterParseResult.Failed;
         }
     }));
 }
コード例 #5
0
    public static T ValueAs <T>(this XElement element, TryParseDelegate <T> parseDelegate, T defaultValue)
    {
        if (null == element)
        {
            return(defaultValue);
        }
        T    result;
        bool ok = parseDelegate(element.Value, out result);

        if (ok)
        {
            return(result);
        }
        return(defaultValue);
    }
コード例 #6
0
        static TryParseMarshaller()
        {
            var type = typeof(T);

            try
            {
                TRY_PARCE = (TryParseDelegate)type
                            .GetMethod("TryParse")
                            .CreateDelegate(typeof(TryParseDelegate));
            }
            catch
            {
                throw new NotSupportedException($"Тип: {typeof(T).Name} не содержит в себе метода bool TryParse(string, out T)");
            }
        }
コード例 #7
0
        private bool TryGetValue <T>(string name, TryParseDelegate <T> parseDelegate, out T result)
        {
            string s;

            result = default(T);
            if (!internalCache.TryGetValue(name, out s))
            {
                return(false);
            }
            if (!parseDelegate(s, out result))
            {
                throw new FormatException(string.Format("Key '{0}': '{1}' is not a value of type {2}", name, s,
                                                        typeof(T).Name));
            }
            return(true);
        }
コード例 #8
0
ファイル: EnumTypeParser.cs プロジェクト: kotx/Qmmands
        public EnumTypeParser(Type enumType, CommandService service)
        {
            _tryParse = (TryParseDelegate <T>)Utilities.TryParseDelegates[typeof(T)];

            var names = Enum.GetNames(enumType);

            _enumByNames  = new Dictionary <string, object>(names.Length, service.StringComparer);
            _enumByValues = new Dictionary <T, object>();
            for (var i = 0; i < names.Length; i++)
            {
                var name  = names[i];
                var value = Enum.Parse(enumType, name);
                _enumByNames[name]      = value;
                _enumByValues[(T)value] = value;
            }
        }
コード例 #9
0
        public static GenericRouteParameterType Create <T>(string partRegex, TryParseDelegate <T> parser)
        {
            return(new GenericRouteParameterType(s => partRegex, (s, p) =>
            {
#pragma warning disable CS8717
                if (parser(s, out var r))
                {
                    return ParameterParseResult.Create((object)r !);
                }
#pragma warning restore CS8717
                else
                {
                    return ParameterParseResult.Failed;
                }
            }));
        }
コード例 #10
0
ファイル: ParseUtils.cs プロジェクト: Dreffed/common-utils
        /// <summary>
        /// Gets the parsed value or null.
        /// </summary>
        /// <typeparam name="T">The type to try parse.</typeparam>
        /// <param name="value">a String</param>
        /// <param name="parser">a delegate of: bool f(string, out T)</param>
        /// <returns>T or null</returns>
        public static T?AsNullableOf <T>(this string value, TryParseDelegate <T> parser) where T : struct
        {
            T?result;
            T _t;

            if (parser(value, out _t))
            {
                result = _t;
            }
            else
            {
                result = null;
            }

            return(result);
        }
コード例 #11
0
            static Parser()
            {
                var method = HarmonyLib.AccessTools.Method(typeof(T), "TryParse");

                if (method == null)
                {
                    return;
                }
                var outValue    = Expression.Parameter(typeof(T).MakeByRefType());
                var stringValue = Expression.Parameter(typeof(string));

                tryParse = Expression.Lambda <TryParseDelegate>(
                    Expression.Call(method, stringValue, outValue),
                    stringValue,
                    outValue
                    ).Compile();
            }
コード例 #12
0
        public static T?ToNullablePrimitive <T>(this string data,
                                                TryParseDelegate <T> func) where T : struct
        {
            if (string.IsNullOrEmpty(data))
            {
                return(null);
            }

            T output;

            if (func(data, out output))
            {
                return((T?)output);
            }

            return(null);
        }
コード例 #13
0
        public virtual T Get <T>(string key, TryParseDelegate <T> tryParse, T defaultvalue)
        {
            if (Contains(key))
            {
                var value = Get(key);

                if (tryParse(value, out var result))
                {
                    return(result);
                }

                return(defaultvalue);
            }
            else
            {
                return(defaultvalue);
            }
        }
        public T GetQueryParam <T>(string key, TryParseDelegate <T> parseDelegate, T defaultVal = default(T))
        {
            string value = GetQueryParam(key);

            if (value == null)
            {
                return(defaultVal);
            }

            T retVal;

            if (!parseDelegate(value, out retVal))
            {
                return(defaultVal);
            }

            return(retVal);
        }
コード例 #15
0
        /// <summary>
        /// Registers the current try parser and its nullable form so it can be used upon request.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tryParser"></param>
        public void RegisterNullable <T>(TryParseDelegate <T> tryParser) where T : struct
        {
            _TryParsers.Add(typeof(T), tryParser);
            _TryParsers.Add(typeof(T?), new TryParseDelegate <T?>((string s, out T? result) =>
            {
                //If the value passed in is null, allow that since this is a nullable type.
                if (s == null)
                {
                    result = null;
                    return(true);
                }

                //Otherwise, only allow successfully parsed values
                var success = tryParser(s, out var temp);
                result      = success ? (T?)temp : null;
                return(success);
            }));
        }
コード例 #16
0
 /// <summary>
 /// Convert the given string to the specified type.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="source">The source string.</param>
 /// <param name="parseFunc">The parse function used to parse the string.</param>
 /// <returns>specified type</returns>
 private static T?To <T>(string source, TryParseDelegate <T> parseFunc) where T : struct
 {
     if (source.IsNullOrEmpty())
     {
         return(null);
     }
     else
     {
         var parseSucceeded = parseFunc(source, out T output);
         if (parseSucceeded)
         {
             return((T?)output);
         }
         else
         {
             return(null);
         }
     }
 }
コード例 #17
0
        }//end method

        //does an operation aggregating the entire line
        public static Nullable <T> LineOperation <T>(this TextFieldParser parser,
                                                     TryParseDelegate <String, T> func, OperationToPreform <T> operation,
                                                     int start, int end) where T : struct
        {
            Nullable <T> aggregation = new T();
            T            result      = new T();

            String[] toks = parser.ReadFields();

            if (start < 1)
            {
                throw new ArgumentException("Starting column is less than one. "
                                            + "Column numbers start at one. ");
            }

            if (end < start)
            {
                throw new ArgumentException("End column is less than the starting column. ");
            }

            if (toks != null)
            {
                for (int i = start - 1; i < toks.Length && toks[i] != "" && i < end; i++)
                {
                    if (func.Invoke(toks[i], out result))
                    {
                        aggregation = operation.Invoke(aggregation.Value, result);
                    }
                    else
                    {
                        throw new IOException(typeof(T).Name + " data not found in file line "
                                              + (parser.LineNumber - 1) + " column " + (i + 1));
                    }
                    //At this point have read one line past where we were, so LineNumber - 1
                } //end loop
            }     //end if
            else
            {
                return(null);
            }

            return(aggregation);
        }//end method
コード例 #18
0
ファイル: ParseExtensions.cs プロジェクト: lulzzz/Boondocks
        private static T?TryParse <T>(string value, TryParseDelegate <T> tryParse, bool throwExceptionOnInvalid)
            where T : struct
        {
            if (string.IsNullOrWhiteSpace(value))
            {
                return(null);
            }

            if (tryParse(value, out var parsed))
            {
                return(parsed);
            }

            if (throwExceptionOnInvalid)
            {
                throw new ParseException($"Unable to parse value '{value}' as '{typeof(T).Name}'.");
            }

            return(null);
        }
コード例 #19
0
        public IConverter <string, TOutput> TryCreate <TOutput>()
        {
            // bool succeeded = TOutput.TryParse(string input, out TOutput result);
            MethodInfo tryParseMethod = typeof(TOutput).GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static,
                                                                  null, new[] { typeof(string), typeof(TOutput).MakeByRefType() }, null);

            // Can't convert for the following close non-matches (don't match TryParseDelegate<TOutput>):
            // *<non-bool>* TryParse(string input, out TOutput result)
            // bool TryParse(string input, *ref* TOutput result)
            if (tryParseMethod == null || tryParseMethod.ReturnType != typeof(bool) ||
                !tryParseMethod.GetParameters()[1].IsOut)
            {
                return(null);
            }

            TryParseDelegate <TOutput> tryParseDelegate =
                (TryParseDelegate <TOutput>)Delegate.CreateDelegate(typeof(TryParseDelegate <TOutput>), tryParseMethod);

            return(new TryParseStringToTConverter <TOutput>(tryParseDelegate));
        }
コード例 #20
0
        private static T ReadFromConsole <T>(TryParseDelegate <T> tryParseMethod, string errorMessage)
        {
            bool inputSuccess = false;
            T    parsedValue;

            do
            {
                string input = Console.ReadLine();
                if (tryParseMethod(input, out parsedValue))
                {
                    inputSuccess = true;
                }
                else
                {
                    Console.WriteLine(errorMessage);
                }
            }while (!inputSuccess);

            return(parsedValue);
        }
コード例 #21
0
        public EnumTypeParser(Type enumType, bool ignoreCase)
        {
            _tryParse = (TryParseDelegate <T>)ReflectionUtilities.TryParseDelegates[typeof(T)];

            var names = Enum.GetNames(enumType);

            _enumByNames  = new Dictionary <string, object>(names.Length, ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal);
            _enumByValues = new Dictionary <T, object>();
            for (var i = 0; i < names.Length; i++)
            {
                var name  = names[i];
                var value = Enum.Parse(enumType, name);
                _enumByNames.Add(name, value);

                if (!_enumByValues.ContainsKey((T)value))
                {
                    _enumByValues.Add((T)value, value);
                }
            }
        }
コード例 #22
0
        public static T ParseValue <T>(ConfigNode node, string valueName, TryParseDelegate <T> tryParse, bool isOptional = false, T defaultValue = default)
        {
            string valueString = node.GetValue(valueName);

            if (isOptional)
            {
                if (string.IsNullOrEmpty(valueString))
                {
                    return(defaultValue);
                }
            }
            else
            {
                if (valueString == null)
                {
                    throw new FormatException($"Missing {typeof(T)} value for {valueName}");
                }

                if (valueString == string.Empty)
                {
                    throw new FormatException($"Empty {typeof(T)} value for {valueName}");
                }
            }

            if (tryParse(valueString, out var value))
            {
                return(value);
            }

            if (isOptional)
            {
                return(defaultValue);
            }

            else
            {
                throw new FormatException($"Improperly formatted {typeof(T)} value for {valueName} : '{valueString}");
            }
        }
コード例 #23
0
ファイル: Rational.cs プロジェクト: atanas-georgiev/MyServer
        /// <summary>
        /// Converts the string representation of a number to its <see cref="Rational&lt;T&gt;"/> equivalent.
        /// A return value indicates whether the conversion succeeded or failed.
        /// </summary>
        /// <param name="value"></param>
        /// <param name="rational"></param>
        /// <returns></returns>
        public static bool TryParse(string value, out Rational <T> rational)
        {
            if (string.IsNullOrEmpty(value))
            {
                rational = Empty;
                return(false);
            }

            if (TryParser == null)
            {
                TryParser = BuildTryParser();
            }

            T numerator, denominator;

            string[] parts = value.Split(DelimSet, 2, StringSplitOptions.RemoveEmptyEntries);
            if (!TryParser(parts[0], out numerator))
            {
                rational = Empty;
                return(false);
            }

            if (parts.Length > 1)
            {
                if (!TryParser(parts[1], out denominator))
                {
                    rational = Empty;
                    return(false);
                }
            }
            else
            {
                denominator = default(T);
            }

            rational = new Rational <T>(numerator, denominator);
            return(parts.Length == 2);
        }
コード例 #24
0
        private static TryParseDelegate <T?> SupportNullable(TryParseDelegate <T> parser)
        {
            return(TryParseNullable);

            bool TryParseNullable(ReadOnlySpan <char> value, [MaybeNullWhen(false)] out T?result)
            {
                if (value.IsEmpty)
                {
                    result = default;
                    return(true);
                }
                else if (parser(value, out var parsedValue))
                {
                    result = parsedValue;
                    return(true);
                }
                else
                {
                    result = default;
                    return(false);
                }
            }
        }
コード例 #25
0
ファイル: EnumTypeParser.cs プロジェクト: Kuromu/Qmmands
        public EnumTypeParser(Type enumType, bool ignoreCase)
        {
            _tryParse = (TryParseDelegate <T>)TypeParserUtils.TryParseDelegates[typeof(T)];
            var enumValuesByNames  = ImmutableDictionary.CreateBuilder <string, object>(ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal);
            var enumValuesByValues = ImmutableDictionary.CreateBuilder <T, object>();

            var names = Enum.GetNames(enumType);

            for (var i = 0; i < names.Length; i++)
            {
                var name  = names[i];
                var value = Enum.Parse(enumType, name, ignoreCase);
                enumValuesByNames.Add(name, value);

                if (!enumValuesByValues.ContainsKey((T)value))
                {
                    enumValuesByValues.Add((T)value, value);
                }
            }

            _enumByNames  = enumValuesByNames.ToImmutable();
            _enumByValues = enumValuesByValues.ToImmutable();
        }
コード例 #26
0
        private static TryParseDelegate GetParser()
        {
            if (s_deleCache != null)
            {
                return(s_deleCache);
            }

            var type           = typeof(T);
            var s              = Expression.Parameter(typeof(string));
            var refType        = type.MakeByRefType();
            var result         = Expression.Parameter(refType);
            var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, null, new[] { s.Type, refType }, null);

            if (tryParseMethod == null)
            {
                throw new MissingMethodException(type.FullName, "TryParse");
            }

            var caller = Expression.Call(tryParseMethod, s, result) as Expression;

            s_deleCache = Expression.Lambda <TryParseDelegate>(caller, s, result).Compile();
            return(s_deleCache);
        }
コード例 #27
0
        public Utf8DictionaryKeyConverter()
        {
            MethodInfo?tryParseMethod = typeof(Utf8Parser).GetMethod(
                nameof(Utf8Parser.TryParse),
                new[] { typeof(ReadOnlySpan <byte>), typeof(T).MakeByRefType(), typeof(int).MakeByRefType(), typeof(char) });

            if (tryParseMethod == null)
            {
                throw new JsonException($"Cannot find method Utf8Parser.TryParse for type {typeof(T)}");
            }

            _tryParseFunc = (TryParseDelegate)tryParseMethod.CreateDelegate(typeof(TryParseDelegate));

            MethodInfo?tryFormatMethod = typeof(Utf8Formatter).GetMethod(
                nameof(Utf8Formatter.TryFormat),
                new[] { typeof(T), typeof(Span <byte>), typeof(int).MakeByRefType(), typeof(StandardFormat) });

            if (tryFormatMethod == null)
            {
                throw new JsonException($"Cannot find method Utf8Parser.TryFormat for type {typeof(T)}");
            }

            _tryFormatFunc = (TryFormatDelegate)tryFormatMethod.CreateDelegate(typeof(TryFormatDelegate));
        }
コード例 #28
0
        public static Func <string[], Tuple <T1> > CreateToTuple <T1>(TryParseDelegate <T1> converter1)
        {
            Contract.Requires <ArgumentNullException>(converter1 != null, "converter1");

            Contract.Ensures(Contract.Result <Func <string[], Tuple <T1> > >() != null);

            return((s) =>
            {
                if (s.Length != 1)
                {
                    return null;
                }

                T1 t1;


                if (!converter1(s[0], out t1))
                {
                    return null;
                }

                return Tuple.Create(t1);
            });
        }
コード例 #29
0
 public HeaderTypeInfo(string name, TryParseDelegate <T> parser, HttpHeaderKind headerKind)
     : base(name, headerKind)
 {
     this.parser = parser;
 }
コード例 #30
0
 public static HeaderInfo CreateSingle <T> (string name, TryParseDelegate <T> parser, HttpHeaderKind headerKind)
 {
     return(new HeaderTypeInfo <T, object> (name, parser, headerKind));
 }