Skip to content

Commit 877a6e8

Browse files
CSHARP-3774: Parsing Enums as Strings is case-insensitive. (#621)
CSHARP-3774: Parsing Enums as Strings is case-insensitive.
1 parent 2932d77 commit 877a6e8

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

src/MongoDB.Bson/Serialization/Serializers/EnumSerializer.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,15 @@ private TEnum ConvertInt64ToEnum(long value)
243243
}
244244
}
245245

246-
private TEnum ConvertStringToEnum(string value) =>
247-
(TEnum)Enum.Parse(typeof(TEnum), value, true);
246+
private TEnum ConvertStringToEnum(string value)
247+
{
248+
if (Enum.TryParse<TEnum>(value, ignoreCase: false, out var result))
249+
{
250+
return result;
251+
}
252+
253+
// fall back to case-insensitive parse
254+
return (TEnum)Enum.Parse(typeof(TEnum), value, ignoreCase: true);
255+
}
248256
}
249257
}

tests/MongoDB.Bson.Tests/Serialization/Serializers/EnumSerializerTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ namespace MongoDB.Bson.Tests.Serialization.Serializers
2727
{
2828
public class EnumSerializerTests
2929
{
30+
public enum CaseSensitiveEnum
31+
{
32+
AnEnumValue,
33+
anenumvalue
34+
}
35+
3036
public enum EnumByte : byte
3137
{
3238
Min = byte.MinValue,
@@ -257,6 +263,30 @@ public void Deserialize_should_throw_on_overflow<TEnum>(TEnum _, string json)
257263
exception.Should().BeOfType<OverflowException>();
258264
}
259265

266+
[Theory]
267+
[InlineData("{ x : 'AnEnumValue' }", CaseSensitiveEnum.AnEnumValue)]
268+
[InlineData("{ x : 'anenumvalue' }", CaseSensitiveEnum.anenumvalue)]
269+
[InlineData("{ x : 'ANENUMVALUE' }", CaseSensitiveEnum.AnEnumValue)]
270+
public void Deserialize_string_should_be_caseinsensitive(string json, CaseSensitiveEnum result)
271+
{
272+
var subject = new EnumSerializer<CaseSensitiveEnum>(BsonType.String);
273+
274+
var deserialized = Deserialize(subject, ToBson(json));
275+
276+
deserialized.Should().Be(result);
277+
}
278+
279+
[Fact]
280+
public void Deserialize_string_should_throw_when_enum_field_is_not_found()
281+
{
282+
var subject = new EnumSerializer<CaseSensitiveEnum>(BsonType.String);
283+
284+
var json = "{ x : 'NotEnumField' }";
285+
var exception = Record.Exception(() => Deserialize(subject, ToBson(json)));
286+
287+
exception.Should().BeOfType<ArgumentException>();
288+
}
289+
260290
[Theory]
261291
// EnumByte test cases
262292
[InlineData(EnumByte.Min, (BsonType).0, "{ x : { $numberInt : '0' } }")]

0 commit comments

Comments
 (0)