Skip to content

Commit 37e39a0

Browse files
committed
Refactoring enum parsing to not fail and instead return a default value if parsing fails
1 parent 7cf212a commit 37e39a0

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

RestSharp.Tests/JsonTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,12 +256,13 @@ public void Can_Deserialize_Various_Enum_Values ()
256256
}
257257

258258
[Fact]
259-
public void Deserialization_Of_Undefined_Int_Value_Still_Throws_InvalidOperationException()
259+
public void Deserialization_Of_Undefined_Int_Value_Returns_Enum_Default()
260260
{
261261
const string data = @"{ ""Integer"" : 1024 }";
262262
var response = new RestResponse { Content = data };
263263
var json = new JsonDeserializer ();
264-
Assert.Throws<InvalidOperationException>(() => json.Deserialize<JsonEnumsTestStructure>(response));
264+
var result = json.Deserialize<JsonEnumsTestStructure>(response);
265+
Assert.Equal(Disposition.Friendly,result.Integer);
265266
}
266267

267268
[Fact]

RestSharp/Extensions/ReflectionExtensions.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,20 @@ public static object ChangeType(this object source, Type newType, CultureInfo cu
9292
public static object FindEnumValue(this Type type, string value, CultureInfo culture)
9393
{
9494
#if FRAMEWORK
95-
var enumValues = Enum.GetValues( type ).Cast<Enum>().ToList();
96-
try
97-
{
98-
return enumValues
99-
.First(v => v.ToString().GetNameVariants(culture).Contains(value, StringComparer.Create(culture, true)));
100-
}
101-
catch (InvalidOperationException)
95+
var ret = Enum.GetValues( type )
96+
.Cast<Enum>()
97+
.FirstOrDefault( v => v.ToString().GetNameVariants( culture ).Contains( value, StringComparer.Create( culture, true ) ) );
98+
99+
if ( ret == null )
102100
{
103101
int enumValueAsInt;
104-
if(int.TryParse( value, out enumValueAsInt ) && Enum.IsDefined(type, enumValueAsInt))
102+
if ( Int32.TryParse( value, out enumValueAsInt ) && Enum.IsDefined( type, enumValueAsInt ) )
105103
{
106-
return enumValues
107-
.First(v => Convert.ToInt32(v) == enumValueAsInt);
108-
}
109-
throw;
104+
ret = (Enum) Enum.ToObject( type, enumValueAsInt );
105+
}
110106
}
107+
108+
return ret;
111109
#else
112110
return Enum.Parse(type, value, true);
113111
#endif

0 commit comments

Comments
 (0)