@@ -31,23 +31,23 @@ ILPostProcessorLogger logger
3131 logger . Debug ( $ "[{ GetType ( ) } ] create search of { _targetType } ") ;
3232 }
3333
34- public TypeReference Search ( )
34+ public TypeReference ? Search ( )
3535 {
3636 if ( ! _targetType . IsGenericInstance || ! _targetType . IsConcreteType ( ) || _targetType . GetGenericParametersOrArgumentsCount ( ) != 1 )
3737 throw new ArgumentException ( $ "{ nameof ( _targetType ) } must be a concrete generic instance with one and only one arguments.", nameof ( _targetType ) ) ;
3838
3939 _logger . Debug ( $ "[{ GetType ( ) } ] search { _targetType } ") ;
4040
4141 var propertyType = _targetType . GetGenericParametersOrArguments ( ) . First ( ) ;
42- TypeReference closestType = null ;
43- TypeReference closestImplementation = null ;
42+ TypeReference ? closestType = null ;
43+ TypeReference ? closestImplementation = null ;
4444 var closestPriority = int . MaxValue ;
45- foreach ( var ( type , implementation ) in FindTypes ( _targetType , ( ( GenericInstanceType ) _targetType ) . ElementType . GenericParameters [ 0 ] ) )
45+ foreach ( var ( type , implementation ) in FindTypes ( _targetType , ( ( GenericInstanceType ) _targetType ) . ElementType . GenericParameters [ 0 ] ! ) )
4646 {
47- var priorityAttribute = type . Resolve ( ) . GetAttributesOf < AnySerializePriorityAttribute > ( ) . SingleOrDefault ( ) ;
48- var priority = priorityAttribute == null ? 0 : ( int ) priorityAttribute . ConstructorArguments [ 0 ] . Value ;
47+ var priorityAttribute = type . Resolve ( ) ! . GetAttributesOf < AnySerializePriorityAttribute > ( ) . SingleOrDefault ( ) ;
48+ var priority = priorityAttribute == null ? 0 : ( int ) priorityAttribute . ConstructorArguments ! [ 0 ] . Value ;
4949 if ( priority > closestPriority ) continue ;
50- if ( ! IsCloserImplementation ( closestImplementation , implementation , propertyType ) ) continue ;
50+ if ( closestPriority == priority && ! IsCloserImplementation ( closestImplementation , implementation , propertyType ) ) continue ;
5151
5252 var concreteType = _container . CreateConcreteTypeFrom ( type ) ;
5353 if ( concreteType == null ) continue ;
@@ -60,18 +60,18 @@ public TypeReference Search()
6060 }
6161 return closestType ;
6262
63- bool IsCloserImplementation ( TypeReference previous , TypeReference current , TypeReference target )
63+ bool IsCloserImplementation ( TypeReference ? previous , TypeReference ? current , TypeReference target )
6464 {
6565 if ( previous == null || previous . IsGenericParameter ) return true ;
6666 if ( current == null || current . IsGenericParameter ) return false ;
6767 if ( previous . TypeEquals ( current ) ) return true ;
6868 if ( previous is ArrayType previousArray && current is ArrayType currentArray && target is ArrayType targetArray )
69- return IsCloserImplementation ( previousArray . ElementType , currentArray . ElementType , targetArray . ElementType ) ;
69+ return IsCloserImplementation ( previousArray . ElementType , currentArray . ElementType , targetArray . ElementType ! ) ;
7070 if ( current . IsArray && target . IsArray ) return true ;
7171
72- var previousDefinition = previous . Resolve ( ) ;
73- var currentDefinition = current . Resolve ( ) ;
74- var targetDefinition = target . Resolve ( ) ;
72+ var previousDefinition = previous . Resolve ( ) ! ;
73+ var currentDefinition = current . Resolve ( ) ! ;
74+ var targetDefinition = target . Resolve ( ) ! ;
7575 var previousDistance = TypeHierarchyDistance ( previousDefinition , target ) ?? TypeHierarchyDistance ( targetDefinition , previous ) ;
7676 var currentDistance = TypeHierarchyDistance ( currentDefinition , target ) ?? TypeHierarchyDistance ( targetDefinition , current ) ;
7777 if ( ! previousDistance . HasValue && ! currentDistance . HasValue ) return true ;
0 commit comments