Support SmartEnums as dictionary keys #458
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This addresses #242 by adding support for SmartEnums as dictionary keys when using System.Text.Json. It adds
ReadAsPropertyNameandWriteAsPropertyNameimplementations to bothSmartEnumNameConverterandSmartEnumValueConverter.Note that there isn't a good way to use the
JsonConverterattribute when you want to use a dictionary with a SmartEnum as a key. Instead, you have to explicitly add the appropriate SmartEnum converter to the serializer options (see the tests for examples of this). While it would be possible to create a somewhat more generic dictionary converter that would allow you to use theJsonConverterattribute, there would have to be separate converter implementations for each of the different dictionary types (IDictionary,IImmutableDictionary,IList<KeyValuePair<TKey, TValue>>, etc.), which doesn't seem worth the effort.A note on the value converter tests: There doesn't seem to be a way to create a C# anonymous object where the property name is not a valid identifier (e.g., you can't create an anonymous object that serializes to
{ "1.5": "foo" }, so I had to jump through a couple of small hoops to create the reference JSON for the (de)serialization tests.