For [my blazor library](https://github.com/Joelius300/ChartJSBlazor) which is a modification of [this awesome library](https://github.com/mariusmuntean/ChartJs.Blazor) I have to convert an `ExpandoObject` into a `Dictionary<string, object>` since `ExpandoObject`s aren't serialized properly in the newest preview versions of dotnet-core. See [my question related to this](https://stackoverflow.com/questions/56693103/invoke-javascript-method-from-c-sharp-with-dynamic-parameter) for more details.
My current approach goes as follows:
```
Dictionary<string, object> ConvertDynamicToDictonary(IDictionary<string, object> value)
{
return value.ToDictionary(
p => p.Key,
p =>
{
// if it's another IDict (might be a ExpandoObject or could also be an actual Dict containing ExpandoObjects) just go through it recursively
if (p.Value is IDictionary<string, object> dict)
{
return ConvertDynamicToDictonary(dict);
}
// if it's an IEnumerable, it might have ExpandoObjects inside, so check for that
if (p.Value is IEnumerable<object> list)
{
if (list.Any(o => o is ExpandoObject))
{
// if it does contain ExpandoObjects, take all of those and also go through them recursively
return list
.Where(o => o is ExpandoObject)
.Select(o => ConvertDynamicToDictonary((ExpandoObject)o));
}
}
// neither an IDict nor an IEnumerable -> it's probably fine to just return the value it has
return p.Value;
}
);
}
```
This works fine but I'm not sure about the `IEnumerable` part. If I omit the `list.Any` check it still works fine. New version (only write the `IEnumerable` part changed):
```
// if it's an IEnumerable, it might have ExpandoObjects inside, so check for that
if (p.Value is IEnumerable<object> list)
{
// take all ExpandoObjects and go through them recursively
return list
.Where(o => o is ExpandoObject)
.Select(o => ConvertDynamicToDictonary((ExpandoObject)o));
}
```
I have also tried using `IEnumerable<ExpandoObject>` instead of just `IEnumerable<object>` to see if that would work and maybe be cleaner and I can confirm that that does **not** work (throws error).
What I would like to know now is, if it's a good idea to omit the `Any` check and which option is more performant (and why) and/or cleaner.
Also please mention every small thing that bugs you, I always want to make it as perfect as possible :)
I first wanted to post this on StackOverflow but I think it fits better on here - correct me if I'm wrong.