@@ -57,23 +57,26 @@ public bool HasMatchingSignature(object[] args, out bool exact)
5757 return true ;
5858 }
5959
60- for ( int i = 0 ; i < args . Length ; i ++ )
60+ int argCount = args . Length ;
61+ for ( int i = 0 ; i < argCount ; i ++ )
6162 {
63+ Type parameterType = Parameters [ i ] . ParameterType ;
64+
6265 if ( args [ i ] == null )
6366 {
64- if ( CanAssignNull ( Parameters [ i ] . ParameterType ) )
67+ if ( CanAssignNull ( parameterType ) )
6568 {
6669 continue ;
6770 }
6871
6972 return false ;
7073 }
7174
75+ Type argType = args [ i ] . GetType ( ) ;
7276 if ( exact )
7377 {
74- if ( args [ i ] . GetType ( ) != Parameters [ i ] . ParameterType &&
75- args [ i ] . GetType ( ) . MakeByRefType ( ) != Parameters [ i ] . ParameterType &&
76- ! CanConvertNumber ( args [ i ] , Parameters [ i ] . ParameterType ) )
78+ if ( argType != parameterType && argType . MakeByRefType ( ) != parameterType &&
79+ ! CanConvertNumber ( args [ i ] , parameterType ) )
7780 {
7881 exact = false ;
7982 }
@@ -84,23 +87,23 @@ public bool HasMatchingSignature(object[] args, out bool exact)
8487 continue ;
8588 }
8689
87- if ( args [ i ] . GetType ( ) == Parameters [ i ] . ParameterType ||
88- args [ i ] . GetType ( ) . MakeByRefType ( ) == Parameters [ i ] . ParameterType ||
89- Parameters [ i ] . ParameterType . FullName == "System.Object" )
90+ if ( argType == parameterType || argType . MakeByRefType ( ) == parameterType ||
91+ parameterType . FullName == "System.Object" )
9092 {
9193 continue ;
9294 }
9395
94- if ( args [ i ] . GetType ( ) . IsValueType )
96+ if ( argType . IsValueType )
9597 {
96- if ( ! TypeDescriptor . GetConverter ( Parameters [ i ] . ParameterType ) . CanConvertFrom ( args [ i ] . GetType ( ) ) && ! CanConvertNumber ( args [ i ] , Parameters [ i ] . ParameterType ) )
98+ if ( ! TypeDescriptor . GetConverter ( parameterType ) . CanConvertFrom ( argType ) &&
99+ ! CanConvertNumber ( args [ i ] , parameterType ) )
97100 {
98101 return false ;
99102 }
100103 }
101104 else
102105 {
103- if ( ! Parameters [ i ] . ParameterType . IsInstanceOfType ( args [ i ] ) )
106+ if ( ! parameterType . IsInstanceOfType ( args [ i ] ) )
104107 {
105108 return false ;
106109 }
@@ -120,9 +123,15 @@ private bool CanAssignNull(Type type)
120123 return Nullable . GetUnderlyingType ( type ) != null ;
121124 }
122125
123- private bool IsNumber ( object obj )
126+ private bool IsNumber ( object ? obj )
124127 {
125- return obj != null && IsNumber ( Nullable . GetUnderlyingType ( obj . GetType ( ) ) ?? obj . GetType ( ) ) ;
128+ if ( obj == null )
129+ {
130+ return false ;
131+ }
132+
133+ Type objectType = obj . GetType ( ) ;
134+ return IsNumber ( Nullable . GetUnderlyingType ( objectType ) ?? objectType ) ;
126135 }
127136
128137 private bool IsNumber ( Type type )
0 commit comments