@@ -156,65 +156,63 @@ private static bool Implements(this Type type, Type interfaceType, Type[][] type
156
156
? IsAssignableToGenericType ( interfaceType , typeArgs )
157
157
: interfaceType . IsAssignableFrom ;
158
158
159
- return isAssignableFromSpecifiedInterface ( type )
159
+ return GetTypeHierarchy ( type ) . Any ( isAssignableFromSpecifiedInterface )
160
160
|| type . GetInterfaces ( ) . Any ( isAssignableFromSpecifiedInterface ) ;
161
- }
162
161
163
- private static Func < Type , bool > IsAssignableToGenericTypeDefinition ( Type interfaceTypeInfo , Type [ ] [ ] typeArgs )
164
- {
165
- var genericArgumentsCount = interfaceTypeInfo . GetGenericArguments ( ) . Length ;
162
+ static IEnumerable < Type > GetTypeHierarchy ( Type ? t )
163
+ {
164
+ while ( t is not null )
165
+ {
166
+ yield return t ;
167
+ t = t . BaseType ;
168
+ }
169
+ }
166
170
167
- return i =>
171
+ static Func < Type , bool > IsAssignableToGenericTypeDefinition ( Type interfaceTypeInfo , Type [ ] [ ] typeArgs )
168
172
{
169
- var genericArguments = i . GenericTypeArguments ;
170
- var isAssignable = i . IsGenericType && genericArguments . Length == genericArgumentsCount ;
171
- if ( isAssignable )
173
+ return i =>
172
174
{
173
- try
175
+ var isAssignable = false ;
176
+ if ( i . IsGenericType )
174
177
{
175
- isAssignable = interfaceTypeInfo . MakeGenericType ( genericArguments ) . IsAssignableFrom ( i ) ;
178
+ var typeDef = i . IsGenericTypeDefinition ? i : i . GetGenericTypeDefinition ( ) ;
179
+ isAssignable = typeDef == interfaceTypeInfo ;
176
180
}
177
- catch ( ArgumentException )
181
+
182
+ if ( isAssignable )
178
183
{
179
- // justification:
180
- // https://stackoverflow.com/questions/4864496/checking-if-an-object-meets-a-generic-parameter-constraint/4864565#4864565
181
- isAssignable = false ;
184
+ typeArgs [ 0 ] = i . GenericTypeArguments ;
182
185
}
183
- }
184
186
185
- if ( isAssignable )
186
- {
187
- typeArgs [ 0 ] = genericArguments ;
188
- }
189
-
190
- return isAssignable ;
191
- } ;
192
- }
193
-
194
- private static Func < Type , bool > IsAssignableToGenericType ( Type interfaceTypeInfo , Type [ ] [ ] typeArgs )
195
- {
196
- var interfaceTypeDefinition = interfaceTypeInfo . GetGenericTypeDefinition ( ) ;
197
- var interfaceGenericArguments = interfaceTypeInfo . GetGenericArguments ( ) ;
187
+ return isAssignable ;
188
+ } ;
189
+ }
198
190
199
- return i =>
191
+ static Func < Type , bool > IsAssignableToGenericType ( Type interfaceTypeInfo , Type [ ] [ ] typeArgs )
200
192
{
201
- if ( i . IsGenericType && ! i . IsGenericTypeDefinition )
193
+ var interfaceTypeDefinition = interfaceTypeInfo . GetGenericTypeDefinition ( ) ;
194
+ var interfaceGenericArguments = interfaceTypeInfo . GetGenericArguments ( ) ;
195
+
196
+ return i =>
202
197
{
203
- var typeDefinition = i . GetGenericTypeDefinition ( ) ;
204
- if ( typeDefinition == interfaceTypeDefinition )
198
+ if ( i . IsGenericType && ! i . IsGenericTypeDefinition )
205
199
{
206
- var genericArguments = i . GetGenericArguments ( ) ;
207
- var allArgumentsAreAssignable = Enumerable . Range ( 0 , genericArguments . Length - 1 )
208
- . All ( index => Implements ( genericArguments [ index ] , interfaceGenericArguments [ index ] , typeArgs ) ) ;
209
- if ( allArgumentsAreAssignable )
200
+ var typeDefinition = i . GetGenericTypeDefinition ( ) ;
201
+ if ( typeDefinition == interfaceTypeDefinition )
210
202
{
211
- return true ;
203
+ var genericArguments = i . GetGenericArguments ( ) ;
204
+ var allArgumentsAreAssignable = Enumerable . Range ( 0 , genericArguments . Length - 1 )
205
+ . All ( index => Implements ( genericArguments [ index ] , interfaceGenericArguments [ index ] , typeArgs ) ) ;
206
+ if ( allArgumentsAreAssignable )
207
+ {
208
+ return true ;
209
+ }
212
210
}
213
211
}
214
- }
215
212
216
- return false ;
217
- } ;
213
+ return false ;
214
+ } ;
215
+ }
218
216
}
219
217
220
218
/// <summary>
0 commit comments