private static T ParseFirst <T>(IEnumerable <string> toParse, TryParseFunction <T> tryParse) { foreach (var str in toParse) { if (tryParse(str, out var parsed)) { return(parsed); } } return(default);
/// <summary> /// This method is syntaxtic sugar for atempting to read a data field /// from an XmlNode. This version sets the output variable to its /// default value in case of a failed read and can be used for /// initializing variables. It can work on any type, but it requires /// a tryParse style function that is fed the nodes InnerText /// </summary> /// <typeparam name="T"></typeparam> /// <param name="node"></param> /// <param name="field"></param> /// <param name="parser"></param> /// <param name="read"></param> /// <param name="onError"></param> /// <returns></returns> public static bool TryGetField <T>(this XmlNode node, string field, TryParseFunction <T> parser, out T read, T onError = default(T)) { string fieldValue = node[field]?.InnerText; if (parser != null && fieldValue != null) { return(parser(fieldValue, out read)); } read = onError; return(false); }
/// <summary> /// This method is syntaxtic sugar for atempting to read a data field /// from an XmlNode. This version sets the output variable to its /// default value in case of a failed read and can be used for /// initializing variables. It can work on any type, but it requires /// a tryParse style function that is fed the nodes InnerText /// </summary> /// <typeparam name="T"></typeparam> /// <param name="node"></param> /// <param name="field"></param> /// <param name="parser"></param> /// <param name="read"></param> /// <param name="onError"></param> /// <returns></returns> public static bool TryGetField <T>(this XmlNode node, string field, TryParseFunction <T> parser, out T read, T onError = default(T)) { if (parser != null) { XmlNode xmlField = node?[field]; if (xmlField != null) { return(parser(xmlField.InnerText, out read)); } } read = onError; return(false); }
/// <summary> /// This method is syntaxtic sugar for atempting to read a data field /// from an XmlNode. This version sets the output variable to its /// default value in case of a failed read and can be used for /// initializing variables. It can work on any type, but it requires /// a tryParse style function that is fed the nodes InnerText /// </summary> /// <typeparam name="T"></typeparam> /// <param name="node"></param> /// <param name="field"></param> /// <param name="parser"></param> /// <param name="read"></param> /// <param name="onError"></param> /// <returns></returns> public static bool TryGetField <T>(this XPathNavigator node, string field, TryParseFunction <T> parser, out T read, T onError = default(T)) { if (parser != null) { XPathNavigator objField = node?.SelectSingleNode(field); if (objField != null) { return(parser(objField.Value, out read)); } } read = onError; return(false); }
/// <summary> /// This method is syntaxtic sugar for atempting to read a data field /// from an XmlNode. This version sets the output variable to its /// default value in case of a failed read and can be used for /// initializing variables. It can work on any type, but it requires /// a tryParse style function that is fed the nodes InnerText /// </summary> /// <typeparam name="T"></typeparam> /// <param name="node"></param> /// <param name="field"></param> /// <param name="parser"></param> /// <param name="read"></param> /// <param name="onerror"></param> /// <returns></returns> public static bool TryGetField <T>(this XmlNode node, String field, TryParseFunction <T> parser, out T read, T onError = default(T)) { String fieldValue = null; if (!CheckGetField <T>(node, field, ref fieldValue)) { read = onError; return(false); } if (parser != null) { return(parser(fieldValue, out read)); } read = onError; return(false); }
/// <summary> /// Attempts to parse a keyword filter of type <typeparamref name="T"/>, /// from the specified <paramref name="op"/> and <paramref name="val"/>. /// If <paramref name="val"/> can be parsed into <typeparamref name="T"/> using <paramref name="parseFunction"/>, the function returns <c>true</c> /// and the resulting range constraint is stored into <paramref name="range"/>. /// </summary> /// <param name="range">The <see cref="FilterCriteria.OptionalRange{T}"/> to store the parsed data into, if successful.</param> /// <param name="op">The operator for the keyword filter.</param> /// <param name="val">The value of the keyword filter.</param> /// <param name="parseFunction">Function used to determine if <paramref name="val"/> can be converted to type <typeparamref name="T"/>.</param> public static bool TryUpdateCriteriaRange <T>(ref FilterCriteria.OptionalRange <T> range, Operator op, string val, TryParseFunction <T> parseFunction) where T : struct => parseFunction.Invoke(val, out var converted) && tryUpdateCriteriaRange(ref range, op, converted);