From 0b3cee83abfc2f07ec5f7c9d97fe775167419986 Mon Sep 17 00:00:00 2001 From: Jaben Date: Mon, 2 Feb 2015 21:49:09 -0500 Subject: [PATCH] Taking a stab at issue #30. The IDestructuringPolicies are now run before IEnumerable cast -- allowing an opportunity for policies to support IEnumerable values. Added IsValueTypeDictionary function to simplify the look of the dictionary conversion code. --- .../PropertyValueConverter-net40.cs | 46 +++++++++++-------- .../Parameters/PropertyValueConverter.cs | 45 ++++++++++-------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/Serilog/Parameters/PropertyValueConverter-net40.cs b/src/Serilog/Parameters/PropertyValueConverter-net40.cs index 9d5e69f74..ce848bfcc 100644 --- a/src/Serilog/Parameters/PropertyValueConverter-net40.cs +++ b/src/Serilog/Parameters/PropertyValueConverter-net40.cs @@ -105,7 +105,7 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur var valueType = value.GetType(); var limiter = new DepthLimiter(depth, _maximumDestructuringDepth, this); - + foreach (var scalarConversionPolicy in _scalarConversionPolicies) { ScalarValue converted; @@ -113,6 +113,16 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur return converted; } + if (destructuring == Destructuring.Destructure) + { + foreach (var destructuringPolicy in _destructuringPolicies) + { + LogEventPropertyValue result; + if (destructuringPolicy.TryDestructure(value, limiter, out result)) + return result; + } + } + var enumerable = value as IEnumerable; if (enumerable != null) { @@ -124,32 +134,22 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur // Only actual dictionaries are supported, as arbitrary types // can implement multiple IDictionary interfaces and thus introduce // multiple different interpretations. - if (valueType.IsGenericType && - valueType.GetGenericTypeDefinition() == typeof(Dictionary<,>) && - IsValidDictionaryKeyType(valueType.GetGenericArguments()[0])) + if (IsValueTypeDictionary(valueType)) { return new DictionaryValue(enumerable.Cast() .Select(kvp => new KeyValuePair( - (ScalarValue)limiter.CreatePropertyValue(kvp.Key, destructuring), - limiter.CreatePropertyValue(kvp.Value, destructuring))) + (ScalarValue)limiter.CreatePropertyValue(kvp.Key, destructuring), + limiter.CreatePropertyValue(kvp.Value, destructuring))) .Where(kvp => kvp.Key.Value != null)); } - return new SequenceValue( - enumerable.Cast().Select(o => limiter.CreatePropertyValue(o, destructuring))); + return + new SequenceValue( + enumerable.Cast().Select(o => limiter.CreatePropertyValue(o, destructuring))); } - - // Unknown types - + if (destructuring == Destructuring.Destructure) { - foreach (var destructuringPolicy in _destructuringPolicies) - { - LogEventPropertyValue result; - if (destructuringPolicy.TryDestructure(value, limiter, out result)) - return result; - } - var typeTag = value.GetType().Name; if (typeTag.Length <= 0 || !char.IsLetter(typeTag[0])) typeTag = null; @@ -160,10 +160,16 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur return new ScalarValue(value.ToString()); } + bool IsValueTypeDictionary(Type valueType) + { + return valueType.IsGenericType && + valueType.GetGenericTypeDefinition() == typeof(Dictionary<,>) && + IsValidDictionaryKeyType(valueType.GetGenericArguments()[0]); + } + bool IsValidDictionaryKeyType(Type valueType) { - return BuiltInScalarTypes.Contains(valueType) || - valueType.IsEnum; + return BuiltInScalarTypes.Contains(valueType) || valueType.IsEnum; } static IEnumerable GetProperties(object value, ILogEventPropertyValueFactory recursive) diff --git a/src/Serilog/Parameters/PropertyValueConverter.cs b/src/Serilog/Parameters/PropertyValueConverter.cs index fbbd78cac..f6007a614 100644 --- a/src/Serilog/Parameters/PropertyValueConverter.cs +++ b/src/Serilog/Parameters/PropertyValueConverter.cs @@ -106,7 +106,7 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur var valueType = value.GetType(); var limiter = new DepthLimiter(depth, _maximumDestructuringDepth, this); - + foreach (var scalarConversionPolicy in _scalarConversionPolicies) { ScalarValue converted; @@ -114,6 +114,16 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur return converted; } + if (destructuring == Destructuring.Destructure) + { + foreach (var destructuringPolicy in _destructuringPolicies) + { + LogEventPropertyValue result; + if (destructuringPolicy.TryDestructure(value, limiter, out result)) + return result; + } + } + var enumerable = value as IEnumerable; if (enumerable != null) { @@ -125,32 +135,22 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur // Only actual dictionaries are supported, as arbitrary types // can implement multiple IDictionary interfaces and thus introduce // multiple different interpretations. - if (valueType.IsConstructedGenericType && - valueType.GetGenericTypeDefinition() == typeof(Dictionary<,>) && - IsValidDictionaryKeyType(valueType.GenericTypeArguments[0])) + if (IsValueTypeDictionary(valueType)) { return new DictionaryValue(enumerable.Cast() .Select(kvp => new KeyValuePair( - (ScalarValue)limiter.CreatePropertyValue(kvp.Key, destructuring), - limiter.CreatePropertyValue(kvp.Value, destructuring))) - .Where(kvp => kvp.Key.Value != null)); // Limiting may kick in + (ScalarValue)limiter.CreatePropertyValue(kvp.Key, destructuring), + limiter.CreatePropertyValue(kvp.Value, destructuring))) + .Where(kvp => kvp.Key.Value != null)); } - return new SequenceValue( - enumerable.Cast().Select(o => limiter.CreatePropertyValue(o, destructuring))); + return + new SequenceValue( + enumerable.Cast().Select(o => limiter.CreatePropertyValue(o, destructuring))); } - - // Unknown types - + if (destructuring == Destructuring.Destructure) { - foreach (var destructuringPolicy in _destructuringPolicies) - { - LogEventPropertyValue result; - if (destructuringPolicy.TryDestructure(value, limiter, out result)) - return result; - } - var typeTag = value.GetType().Name; if (typeTag.Length <= 0 || !char.IsLetter(typeTag[0])) typeTag = null; @@ -161,6 +161,13 @@ LogEventPropertyValue CreatePropertyValue(object value, Destructuring destructur return new ScalarValue(value.ToString()); } + bool IsValueTypeDictionary(Type valueType) + { + return valueType.IsGenericType && + valueType.GetGenericTypeDefinition() == typeof(Dictionary<,>) && + IsValidDictionaryKeyType(valueType.GetGenericArguments()[0]); + } + bool IsValidDictionaryKeyType(Type valueType) { return BuiltInScalarTypes.Contains(valueType) ||