Skip to content

Commit e9ea307

Browse files
authored
fix enums could not be cast to decimal (#576)
* fix enums could not be cast to decimal * add test for enums and decimal/double
1 parent ad1e97c commit e9ea307

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

src/System.Linq.Dynamic.Core/Parser/ExpressionPromoter.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ public virtual Expression Promote(Expression expr, Type type, bool exact, bool c
105105

106106
if (TypeHelper.IsCompatibleWith(expr.Type, type))
107107
{
108-
if (type.GetTypeInfo().IsValueType || exact || expr.Type.GetTypeInfo().IsValueType && convertExpr)
108+
if (type == typeof(decimal) && expr.Type.IsEnum)
109+
{
110+
return Expression.Convert(Expression.Convert(expr, Enum.GetUnderlyingType(expr.Type)), type);
111+
}
112+
else if (type.GetTypeInfo().IsValueType || exact || expr.Type.GetTypeInfo().IsValueType && convertExpr)
109113
{
110114
return Expression.Convert(expr, type);
111115
}

test/System.Linq.Dynamic.Core.Tests/ExpressionTests.cs

+12
Original file line numberDiff line numberDiff line change
@@ -681,12 +681,24 @@ public void ExpressionTests_Enum_Property_Equality_Using_Argument()
681681
var resultEqualIntParamLeft = qry.Where("@0 == it.B", 1).ToDynamicArray();
682682
var resultEqualIntParamRight = qry.Where("it.B == @0", 1).ToDynamicArray();
683683

684+
var resultEqualDecimalParamLeft = qry.Where("@0 == it.B", 1m).ToDynamicArray();
685+
var resultEqualDecimalParamRight = qry.Where("it.B == @0", 1m).ToDynamicArray();
686+
687+
var resultEqualDoubleParamLeft = qry.Where("@0 == it.B", 1.0).ToDynamicArray();
688+
var resultEqualDoubleParamRight = qry.Where("it.B == @0", 1.0).ToDynamicArray();
689+
684690
// Assert
685691
Check.That(resultEqualEnumParamLeft.Single()).Equals(TestEnum2.Var2);
686692
Check.That(resultEqualEnumParamRight.Single()).Equals(TestEnum2.Var2);
687693

688694
Check.That(resultEqualIntParamLeft.Single()).Equals(TestEnum2.Var2);
689695
Check.That(resultEqualIntParamRight.Single()).Equals(TestEnum2.Var2);
696+
697+
Check.That(resultEqualDecimalParamLeft.Single()).Equals(TestEnum2.Var2);
698+
Check.That(resultEqualDecimalParamRight.Single()).Equals(TestEnum2.Var2);
699+
700+
Check.That(resultEqualDoubleParamLeft.Single()).Equals(TestEnum2.Var2);
701+
Check.That(resultEqualDoubleParamRight.Single()).Equals(TestEnum2.Var2);
690702
}
691703

692704
[Fact]

0 commit comments

Comments
 (0)