Задать вопрос
@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*/
            }
        }
    }
}
  • Вопрос задан
  • 44 просмотра
Подписаться 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;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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