public MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int positionalValue = -1) { var level = _currentNestLevel; var ret = ReturnDefaultIfMaxNestLevel(level) ?? _root.CreatePropertyValue(value, mode, level + 1, positionalValue); _currentNestLevel = level; return(ret); }
public static bool TryResolveToEnumerable(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue, int maxLoopCountForCollection, out MessagePropertyValue result) { if (value is IEnumerable __enumerable) { if (TryGetDictionary(value, typeOfValue, out var dictionary)) { result = new DictionaryValue(DictionaryElements()); return(true); IEnumerable <KeyValuePair <ScalarValue, MessagePropertyValue> > DictionaryElements() { var __index = 0; foreach (DictionaryEntry __item in dictionary) { if (++__index > maxLoopCountForCollection) { yield break; } if (nest.CreatePropertyValue(__item.Key, mode) is ScalarValue __key) { var __value = nest.CreatePropertyValue(__item.Value, mode); yield return(new KeyValuePair <ScalarValue, MessagePropertyValue>(__key, __value)); } } } } result = new SequenceValue(SequenceElements()); return(true); IEnumerable <MessagePropertyValue> SequenceElements() { var __index = 0; foreach (var __item in __enumerable) { if (++__index > maxLoopCountForCollection) { yield break; } yield return(nest.CreatePropertyValue(__item, mode)); } } } result = null; return(false); }
public static bool TryResolveCompilerGeneratedType(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue, bool raiseException, int positionalValue, out MessagePropertyValue result) { if (mode == PropertyResolvingMode.Destructure) { result = new StructureValue(StructureElements(), Tag()); return(true); string Tag() { var __tag = typeOfValue.Name; if (string.IsNullOrWhiteSpace(__tag) || typeOfValue.IsCompilerGeneratedType()) { __tag = null; } return(__tag); } IEnumerable <MessageProperty> StructureElements() { foreach (var property in value.GetType().GetPropertiesRecursive()) { dynamic propertyValue; try { propertyValue = property.GetValue(value); } catch (TargetParameterCountException) { InternalLogger.WriteLine("The property accessor '{0}' is a non-default indexer", property); continue; } catch (TargetInvocationException ex) { InternalLogger.WriteLine("The property accessor '{0}' threw exception: {1}", property, ex); if (raiseException) { throw; } propertyValue = $"Threw an exception at: {ex.InnerException?.GetType().Name}"; } yield return(new MessageProperty(property.Name, positionalValue, nest.CreatePropertyValue(propertyValue, PropertyResolvingMode.Destructure))); } } } result = null; return(false); }
public static bool TryResolveToValueTuple(object value, PropertyResolvingMode mode, NestParameterResolver nest, Type typeOfValue, out MessagePropertyValue result) { result = CheckingValueTypeDefinition(typeOfValue, value) ? new SequenceValue(SequenceElements()) : null; return(result != null); IEnumerable <MessagePropertyValue> SequenceElements() { var __fields = typeOfValue.GetTypeInfo().DeclaredFields.Where(f => f.IsPublic && !f.IsStatic); foreach (var __field in __fields) { yield return(nest.CreatePropertyValue(__field.GetValue(value), mode)); } } }
internal MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int level, int positionalValue) { if (value == null) { return(ReturnNullValue()); } if (mode == PropertyResolvingMode.Stringify) { return(ReturnStringifyValue(value)); } if (mode == PropertyResolvingMode.Destructure && value is string str) { value = FixStringifyValueForMaxLength(str); } var typeOfValue = value.GetType(); _nestParameterResolver.SetNestLevel(level); if (_scalarResolveRules.TryResolve(value, out var result0)) { return(result0); } if (_destructureResolveRules.TryResolve(value, mode, _nestParameterResolver, out var result1)) { return(result1); } if (TypeFeeler.TryResolveToEnumerable(value, mode, _nestParameterResolver, typeOfValue, _maxLoopCountForCollection, out var result2)) { return(result2); } if (TypeFeeler.TryResolveToValueTuple(value, mode, _nestParameterResolver, typeOfValue, out var result3)) { return(result3); } if (TypeFeeler.TryResolveCompilerGeneratedType(value, mode, _nestParameterResolver, typeOfValue, _raiseExceptions, positionalValue, out var result4)) { return(result4); } return(ReturnDefaultValue(value)); }
public static bool TryResolve(this IDestructureResolveRule[] rules, object value, PropertyResolvingMode mode, NestParameterResolver nest, out MessagePropertyValue result) { result = null; if (mode == PropertyResolvingMode.Destructure) { foreach (var rule in rules) { if (rule.TryResolve(value, nest, out result)) { return(true); } } } return(false); }
/// <inheritdoc /> public MessagePropertyValue CreatePropertyValue(object value, PropertyResolvingMode mode, int positionalValue = -1) { return(CreatePropertyValue(value, mode, 1, positionalValue)); }
/// <inheritdoc /> public MessageProperty CreateProperty(string name, object value, PropertyResolvingMode mode, int positionalValue = -1) { return(new MessageProperty(name, positionalValue, CreatePropertyValue(value, mode, positionalValue))); }