示例#1
0
        /// <typeparam name="TEnum">Members should be bit indices, not literal flag values</typeparam>
        /// <param name="valueSeperator">regex pattern used to seperate values</param>
        public bool?GetFlagsValue <TEnum>(string valueName, ref BitVector32 retVal
                                          , string valueSeperator = ",", bool logFailures = true)
            where TEnum : struct, IComparable, IFormattable, IConvertible
        {
            object value = TryGetValueForName(valueName);

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

            bool?result = null;

            switch (Type.GetTypeCode(value.GetType()))
            {
            case TypeCode.String:
                result = retVal.TryParseFlags <TEnum>((string)value, valueSeperator, logFailures ? JsonNodeGlobals.gErrorsOutputList : null);
                break;

            case TypeCode.Object:
            {
                if (!(value is List <object> objList))
                {
                    return(false);
                }

                result = retVal.TryParseFlags <TEnum>(objList.OfType <string>(), logFailures ? JsonNodeGlobals.gErrorsOutputList : null);
                break;
            }

            default:
                return(false);
            }

            if (logFailures && JsonNodeGlobals.gErrorsOutputList.Count > 0)
            {
                Debug.Trace.IO.TraceDataSansId(System.Diagnostics.TraceEventType.Error, string.Format(Util.InvariantCultureInfo,
                                                                                                      "Failed parsing {0} value '{1}' as an {2}:\n{3}",
                                                                                                      valueName, value, "FLAGS", JsonNodeGlobals.gErrorsOutputList.Join("\n")));
                JsonNodeGlobals.gErrorsOutputList.Clear();
            }

            return(result);
        }