@@ -231,6 +231,9 @@ static object MakeLookup(
231231 {
232232 [ typeof ( List < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeList ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
233233 [ typeof ( IList < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeList ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
234+ [ typeof ( IReadOnlyList < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeList ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
235+ [ typeof ( IReadOnlyCollection < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeList ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
236+ [ typeof ( IEnumerable < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeList ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
234237 [ typeof ( Collection < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeCollection ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
235238 [ typeof ( ICollection < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeCollection ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
236239 [ typeof ( ObservableCollection < > ) ] = ( type , values , reflector ) => InvokeGeneric ( nameof ( MakeObservableCollection ) , type . GetGenericArguments ( ) [ 0 ] , new object [ ] { values , reflector } ) ,
@@ -352,12 +355,9 @@ static bool IsDictionary(Type type)
352355 }
353356
354357 var genericType = type . GetGenericTypeDefinition ( ) ;
355- if ( genericType != typeof ( Dictionary < , > ) )
356- {
357- return false ;
358- }
359-
360- return true ;
358+ return genericType == typeof ( Dictionary < , > )
359+ || genericType == typeof ( IDictionary < , > )
360+ || genericType == typeof ( IReadOnlyDictionary < , > ) ;
361361 }
362362
363363 [ UnconditionalSuppressMessage ( "ReflectionAnalysis" , "IL2060" , Justification = "Analysis cannot follow MakeGenericMethod but we should be clear by here anyway." ) ]
@@ -367,9 +367,15 @@ static object MakeDictionary(
367367 KVObject kv ,
368368 IObjectReflector reflector )
369369 {
370- var dictionary = Activator . CreateInstance ( type ) ;
371370 var genericArguments = type . GetGenericArguments ( ) ;
372371
372+ // For interface types (IDictionary<,>, IReadOnlyDictionary<,>), use concrete Dictionary<,>
373+ var concreteType = type . GetGenericTypeDefinition ( ) == typeof ( Dictionary < , > )
374+ ? type
375+ : typeof ( Dictionary < , > ) . MakeGenericType ( genericArguments ) ;
376+
377+ var dictionary = Activator . CreateInstance ( concreteType ) ;
378+
373379 var method = typeof ( ObjectCopier )
374380 . GetMethod ( nameof ( FillDictionary ) , BindingFlags . Static | BindingFlags . NonPublic ) ! ;
375381 method . MakeGenericMethod ( genericArguments )
0 commit comments