@@ -222,15 +222,21 @@ private bool IsQueryCacheable()
222222 private static bool IsTypeCacheable ( Type type , IReadOnlySet < Type > supportedTypes )
223223 {
224224 var type1 = type . StripNullable ( ) ;
225- if ( type1 . IsGenericType ) {
226- // IReadOnlyList<T> implementations + ValueTuple<> with different number of argument types
227- if ( type1 . IsValueTuple ( ) && type1 . GetGenericArguments ( ) . All ( t => IsTypeCacheable ( t , supportedTypes ) ) ) {
225+ var typeInfo = type1 . GetTypeInfo ( ) ;
226+ if ( typeInfo . IsGenericType ) {
227+ // IReadOnlyList<T> implementations + ValueTuple<> with different number of type arguments
228+ if ( type1 . IsValueTuple ( ) ) {
229+ foreach ( var arg in typeInfo . GenericTypeArguments ) {
230+ if ( ! IsTypeCacheable ( arg , supportedTypes ) ) {
231+ return false ;
232+ }
233+ }
228234 return true ;
229235 }
230- var genericDef = type1 . GetGenericTypeDefinition ( ) ;
231- return genericDef . IsAssignableTo ( WellKnownTypes . IReadOnlyListOfT ) && IsTypeCacheable ( type1 . GetGenericArguments ( ) [ 0 ] , supportedTypes ) ;
236+ var genericDef = typeInfo . GetGenericTypeDefinition ( ) ;
237+ return genericDef . IsAssignableTo ( WellKnownTypes . IReadOnlyListOfT ) && IsTypeCacheable ( typeInfo . GetGenericArguments ( ) [ 0 ] , supportedTypes ) ;
232238 }
233- else if ( type1 . IsArray ) {
239+ else if ( typeInfo . IsArray ) {
234240 return IsTypeCacheable ( type1 . GetElementType ( ) , supportedTypes ) ;
235241 }
236242 else {
@@ -251,7 +257,7 @@ private static bool IsTypeCacheable(Type type, IReadOnlySet<Type> supportedTypes
251257 TypeCode . Char => true ,
252258 TypeCode . String => true ,
253259 TypeCode . DateTime => true ,
254- TypeCode . Object => type1 . IsValueType ,
260+ TypeCode . Object => typeInfo . IsValueType ,
255261 _ => false
256262 } ;
257263 }
0 commit comments