private static Type FindEnumerableTypeArgument(Type type)
{
// The type may implement multiple interfaces including IEnumerable<T> where the type generic definition of the type itself is not the same as the IEnumerable<T> definition
// Dictionary<TKey, TValue> is an example of this where it implements IEnumerable<KeyValuePair<TKey, TValue>>
var topLevelTypeArgument = GetEnumerableTypeArgument(type);
if (topLevelTypeArgument != null)
{
// The type itself is IEnumerable<T> so we don't need to search the implemented interfaces
return topLevelTypeArgument;
}
var interfaces = type.GetInterfaces();
for (var index = 0; index < interfaces.Length; index++)
{
var internalType = interfaces[index];
var genericTypeArgument = GetEnumerableTypeArgument(internalType);
if (genericTypeArgument != null)
{
return genericTypeArgument;
}
}
return null;
}