@@ -476,13 +476,27 @@ private Expression ParseComparisonOperator()
476
476
{
477
477
left = e ;
478
478
}
479
- else if ( TypeHelper . IsEnumType ( left . Type ) && ( constantExpr = right as ConstantExpression ) != null )
479
+ else if ( TypeHelper . IsEnumType ( left . Type ) )
480
480
{
481
- right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExpr ) ;
481
+ if ( right is ConstantExpression constantExprRight )
482
+ {
483
+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , constantExprRight ) ;
484
+ }
485
+ else if ( _expressionHelper . TryUnwrapAsExpression < string > ( right , out var unwrappedConstantExprRight ) )
486
+ {
487
+ right = ParseEnumToConstantExpression ( op . Pos , left . Type , unwrappedConstantExprRight ) ;
488
+ }
482
489
}
483
- else if ( TypeHelper . IsEnumType ( right . Type ) && ( constantExpr = left as ConstantExpression ) != null )
490
+ else if ( TypeHelper . IsEnumType ( right . Type ) )
484
491
{
485
- left = ParseEnumToConstantExpression ( op . Pos , right . Type , constantExpr ) ;
492
+ if ( left is ConstantExpression constantExprLeft )
493
+ {
494
+ left = ParseEnumToConstantExpression ( op . Pos , right . Type , constantExprLeft ) ;
495
+ }
496
+ else if ( _expressionHelper . TryUnwrapAsExpression < string > ( left , out var unwrappedConstantExprLeft ) )
497
+ {
498
+ left = ParseEnumToConstantExpression ( op . Pos , right . Type , unwrappedConstantExprLeft ) ;
499
+ }
486
500
}
487
501
else
488
502
{
@@ -498,11 +512,11 @@ private Expression ParseComparisonOperator()
498
512
{
499
513
left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( stringValueL ) , right . Type ) ;
500
514
}
501
- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
515
+ else if ( _expressionHelper . TryUnwrapAsValue < string > ( right , out var unwrappedStringValueR ) && ( typeConverter = _typeConverterFactory . GetConverter ( left . Type ) ) != null && typeConverter . CanConvertFrom ( right . Type ) )
502
516
{
503
517
right = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueR ) , left . Type ) ;
504
518
}
505
- else if ( _expressionHelper . TryUnwrapConstantExpression < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
519
+ else if ( _expressionHelper . TryUnwrapAsValue < string > ( left , out var unwrappedStringValueL ) && ( typeConverter = _typeConverterFactory . GetConverter ( right . Type ) ) != null && typeConverter . CanConvertFrom ( left . Type ) )
506
520
{
507
521
left = Expression . Constant ( typeConverter . ConvertFromInvariantString ( unwrappedStringValueL ) , right . Type ) ;
508
522
}
@@ -581,7 +595,7 @@ private Expression ParseComparisonOperator()
581
595
return left ;
582
596
}
583
597
584
- private bool HasImplicitConversion ( Type baseType , Type targetType )
598
+ private static bool HasImplicitConversion ( Type baseType , Type targetType )
585
599
{
586
600
var baseTypeHasConversion = baseType . GetMethods ( BindingFlags . Public | BindingFlags . Static )
587
601
. Where ( mi => mi . Name == "op_Implicit" && mi . ReturnType == targetType )
@@ -597,12 +611,12 @@ private bool HasImplicitConversion(Type baseType, Type targetType)
597
611
. Any ( mi => mi . GetParameters ( ) . FirstOrDefault ( ) ? . ParameterType == baseType ) ;
598
612
}
599
613
600
- private ConstantExpression ParseEnumToConstantExpression ( int pos , Type leftType , ConstantExpression constantExpr )
614
+ private static ConstantExpression ParseEnumToConstantExpression ( int pos , Type leftType , ConstantExpression constantExpr )
601
615
{
602
616
return Expression . Constant ( ParseConstantExpressionToEnum ( pos , leftType , constantExpr ) , leftType ) ;
603
617
}
604
618
605
- private object ParseConstantExpressionToEnum ( int pos , Type leftType , ConstantExpression constantExpr )
619
+ private static object ParseConstantExpressionToEnum ( int pos , Type leftType , ConstantExpression constantExpr )
606
620
{
607
621
try
608
622
{
@@ -618,7 +632,7 @@ private object ParseConstantExpressionToEnum(int pos, Type leftType, ConstantExp
618
632
619
633
try
620
634
{
621
- return Enum . ToObject ( TypeHelper . GetNonNullableType ( leftType ) , constantExpr . Value ) ;
635
+ return Enum . ToObject ( TypeHelper . GetNonNullableType ( leftType ) , constantExpr . Value ! ) ;
622
636
}
623
637
catch
624
638
{
0 commit comments