Casting um objeto para IEnumerable <T> onde T não é conhecido

Estou tentando brincar com o Reflection e corri para a seguinte situação.

No código a seguir, vamos supor que o 'obj' pode ser de tiposIEnumerable<> ouICollection<> ouIList<>.

Eu gostaria de lançar este System.Object paraIEnumerable<> sempre (comoICollection<> eIList<> herdar deIEnumerable<> de qualquer maneira), de modo que eu gostaria de enumerar sobre a coleção e usar a reflexão para escrever os itens individuais.

Motivação por trás disso é que eu estou apenas tentando ver como serializadores Serializers, em geral, serializar dados e por isso estou tentando simular essa situação na esperança de entender a reflexão também.

Eu pensei em lançar o objeto paraIEnumerable não genérico, mas pensei que isso causaria boxe desnecessário de objetos, quando vamos dizer a instância real deIEnumerable<int>... estou pensando certo?

private void WriteGenericCollection(object obj)
    {
        Type innerType = obj.GetType().GetGenericArguments()[0];

        //Example: IEnumerable<int> or IEnumerable<Customer>
        Type generatedType = typeof(IEnumerable<>).MakeGenericType(innerType);

        //how could i enumerate over the individual items?
    }

questionAnswers(2)

yourAnswerToTheQuestion