public static ValidationIndicators GetValidationIndicators(this object oValue) { double dummyDouble; int dummyInt; bool dummyBool; ValidationIndicators result = 0; if (oValue == null) { return(result | ValidationIndicators.Null); } var value = oValue.ToString(); if (string.IsNullOrEmpty(value)) { return(result | ValidationIndicators.Null); } if (int.TryParse(value, out dummyInt)) { result |= ValidationIndicators.Number; if (dummyInt < 0) { result |= ValidationIndicators.Negative; } if (dummyInt == 0) { result |= ValidationIndicators.Zero; } return(result); } if (double.TryParse(value, out dummyDouble)) { result |= ValidationIndicators.Number; result |= ValidationIndicators.Real; if (dummyDouble < 0) { result |= ValidationIndicators.Negative; } if (dummyDouble == 0) { result |= ValidationIndicators.Zero; } return(result); } if (bool.TryParse(value, out dummyBool)) { result |= ValidationIndicators.Bool; result |= dummyBool ? ValidationIndicators.True : ValidationIndicators.False; return(result); } return(result); }
public static T GetProperty <T>(this JObject jo, string propName, T defaultValue = default(T), ValidationIndicators exclusions = ValidationIndicators.Null | ValidationIndicators.Empty, ValidationAction exclusionValidationAction = ValidationAction.ReturnDefault, ValidationIndicators requirements = ValidationIndicators.None, ValidationAction requirementValidationAction = ValidationAction.ReturnDefault ) { var msg = string.Empty; if (jo == null || string.IsNullOrEmpty(propName)) { switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new ArgumentNullException(nameof(jo)); } } var rx = new Regex($"^{propName}$"); var p = jo.Properties().FirstOrDefault(w => rx.IsMatch(w.Name))?.Name; if (p == null && exclusions.HasFlag(ValidationIndicators.Null)) { msg = $"No properties matching {rx}"; Console.Write(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } if (jo[p].Type == JTokenType.Null && exclusions.HasFlag(ValidationIndicators.Null)) { msg = $"Property {p} does not exist on that object"; Console.WriteLine(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } if (jo[p].Type == JTokenType.Array || jo[p].Type == JTokenType.Object) { if (typeof(JObject) == typeof(T) || typeof(JArray) == typeof(T)) { return(jo[p].Value <T>()); } return(defaultValue); } var val = jo[p].Value <string>(); var valFlags = val.GetValidationIndicators(); if (valFlags.HasFlag(ValidationIndicators.Empty)) { if (exclusions.HasFlag(ValidationIndicators.Empty)) { msg = $"Property {p} was empty but expected value"; Console.WriteLine(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } else { return(jo[p].Value <T>()); } } if (valFlags.HasFlag(ValidationIndicators.Null) && exclusions.HasFlag(ValidationIndicators.Null)) { msg = $"Property {p} was null but expected value"; Console.WriteLine(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } if (valFlags.HasFlag(ValidationIndicators.Zero) && exclusions.HasFlag(ValidationIndicators.Zero)) { msg = "Property {p} was 0 but expected value"; Console.WriteLine(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } if (valFlags.HasFlag(ValidationIndicators.Negative) && exclusions.HasFlag(ValidationIndicators.Negative)) { msg = $"Property {p} was negative but expected positive integer"; Console.WriteLine(msg); switch (exclusionValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } if (!valFlags.HasFlag(ValidationIndicators.Number) && requirements.HasFlag(ValidationIndicators.Number)) { msg = $"Property {p} was not a number but expected one"; Console.WriteLine(msg); switch (requirementValidationAction) { case ValidationAction.ReturnDefault: return(defaultValue); case ValidationAction.Throw: throw new Exception(msg); } } return(jo[p].Value <T>()); }