destructurama / fsharp

Native support for destructuring F# types when logging to Serilog.
Apache License 2.0
38 stars 10 forks source link

list of lists throws InvalidCastException #3

Closed adamchester closed 9 years ago

adamchester commented 9 years ago

Using the test script, I get the an InvalidCastException:

>fsi lists.fsx
System.InvalidCastException: Unable to cast object of type 'Microsoft.FSharp.Collections.FSharpList`1[System.Int32]' to type 'System.Collections.Generic.IEnumerable`1[System.Object]'.
   at Destructurama.FSharp.FSharpTypesDestructuringPolicy.Serilog-Core-IDestructuringPolicy-TryDestructure(Object value, ILogEventPropertyValueFactory propertyValueFactory, LogEventPropertyValue& result) in C:\projects\fsharp\src\Destructurama.FSharp\DestructuramaFSharp.fs:line 31
   at Serilog.Parameters.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth) in c:\projects\serilog\src\Serilog\Parameters\PropertyValueConverter-net40.cs:line 121
   at Serilog.Parameters.PropertyValueConverter.DepthLimiter.CreatePropertyValue(Object value, Boolean destructureObjects) in c:\projects\serilog\src\Serilog\Parameters\DepthLimiter.cs:line 45
   at Microsoft.FSharp.Collections.IEnumerator.map@111.DoMoveNext(b& )
   at Microsoft.FSharp.Collections.IEnumerator.MapEnumerator`1.System-Collections-IEnumerator-MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Serilog.Events.SequenceValue..ctor(IEnumerable`1 elements) in c:\projects\serilog\src\Serilog\Events\SequenceValue-net40.cs:line 37
   at Destructurama.FSharp.FSharpTypesDestructuringPolicy.Serilog-Core-IDestructuringPolicy-TryDestructure(Object value, ILogEventPropertyValueFactory propertyValueFactory, LogEventPropertyValue& result) in C:\projects\fsharp\src\Destructurama.FSharp\DestructuramaFSharp.fs:line 33
   at Serilog.Parameters.PropertyValueConverter.CreatePropertyValue(Object value, Destructuring destructuring, Int32 depth) in c:\projects\serilog\src\Serilog\Parameters\PropertyValueConverter-net40.cs:line 121
   at Serilog.Parameters.PropertyBinder.ConstructProperty(PropertyToken propertyToken, Object value) in c:\projects\serilog\src\Serilog\Parameters\PropertyBinder.cs:line 122
   at Serilog.Parameters.PropertyBinder.ConstructNamedProperties(MessageTemplate template, Object[] messageTemplateParameters) in c:\projects\serilog\src\Serilog\Parameters\PropertyBinder.cs:line 113
   at Serilog.Parameters.PropertyBinder.ConstructProperties(MessageTemplate messageTemplate, Object[] messageTemplateParameters) in c:\projects\serilog\src\Serilog\Parameters\PropertyBinder.cs:line 57
   at Serilog.Core.Pipeline.Logger.Write(LogEventLevel level, Exception exception, String messageTemplate, Object[] propertyValues) in c:\projects\serilog\src\Serilog\Core\Pipeline\Logger.cs:line 138
   at Serilog.Core.Pipeline.Logger.Verbose(String messageTemplate, Object[] propertyValues) in c:\projects\serilog\src\Serilog\Core\Pipeline\Logger.cs:line 177
   at <StartupCode$FSI_0001>.$FSI_0001.main@() in C:\repo\fserilog\serilog.fsx:line 40
Stopped due to error

The test script is:

#I "packages/Serilog/lib/net40"
#r "Serilog"
#r "Serilog.FullNetFx"

#I "packages/Destructurama.FSharp/lib/portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10"
#r "Destructurama.FSharp"

open Serilog

Log.Logger <- LoggerConfiguration()
    .Destructure.FSharpTypes()
    .WriteTo.ColoredConsole()
    .MinimumLevel.Verbose()
    .CreateLogger()

let myListOfLists = [
    [1;2;3;4;5]
    [6;7;8;9;10]
]

Log.Verbose("List of lists {@list}", myListOfLists)

I used the following nuget package versions:

NUGET
  remote: https://nuget.org/api/v2
  specs:
    Destructurama.FSharp (1.0.8)
      Serilog (>= 1.4.204)
    Serilog (1.5.6)
nblumhardt commented 9 years ago

Hmmmm... interesting... Not possible this is something to do with running on .NET 4? I'll dig in as soon as I have a chance, thanks for the report!

adamchester commented 9 years ago

I believe it's because it won't auto box the int as objects. I was going to take a stab at this maybe tonight :)