Задать вопрос
@OrdUs

Как проверить, наследует ли объект в обобщённом методе?

ПРОЧИТАЙТЕ КОММЕНТАРИИ В КОДЕ, пожалуйста
Хочу написать метод, который преобразует коллекцию неизвестного типа и все коллекции внутри неё в читаемый для человека вид. Как мне это сделать?
namespace EXTRA
{
    public static class ArrToStr
    {
        public static string Transform<T>(IEnumerable<T> input)
        {
            string output = "[";
            foreach (T item in input) output = $"{output}{item}, ";
            return $"{output[0..(output.Length-2)]}]";
        }

        public static string DeepTransform<T>(IEnumerable<T> input)
        {
            string output = "[";

            foreach (T item in input)
            {
                if (item is IEnumerable) ; // C# пишет, будто мне нужно указать тип для IEnumerable, но он мне неизвестен — там может быть и int, и double, и string, и что угодно ещё. Как мне проверить, является ли объект коллекцией или нет?
                else;
                /* Кажется, IEnumerable не поддерживает индексирование, поэтому я хочу проверить первый элемент через foreach и, в зависимости от того, наследует ли объект IEnumerable, добавить вложенный цикл, вызывающий или Transform, или DeepTransform для всех элементов input*/
            }
        }
    }
}
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    SDP-030_PRG Продвинутая разработка в Microsoft .NET
    1 неделя
    Далее
  • Ulearn.me
    Проектирование на языке C#
    1 неделя
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 2
    1 неделя
    Далее
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Получить список интерфейсов объекта из его типа и проверить есть ли среди них нужный вам универсальный интерфейс:
if (item != null
    && item.GetType().GetInterfaces().Any(
        i => i.IsGenericType
        && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    )
{
    IEnumerable<object> collection = (IEnumerable<object>)item;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы