С# выяснить содержимое листа при GetType().GetFields

173
22 июля 2018, 17:20

Мы узнаем количество полей и их значение в классе следующим образом

     object bobik = new dog();
     foreach(FieldInfo field in bobik.GetType().GetFields())
     {
      Console.WriteLine("{0} {1} {2}", field.FieldType, field.Name, 
      field.GetValue(bobik));
     }

Но если нам в классе, встретится например, list, то консоль нам выведет

System.Collections.Generic.List`1[ClassName] fieldName 

Как в процессе развернуть лист тоже? Можно сделать

if(field.GetType().IsArray)
{
SomeAction
}

Но нельзя сделать

IsList

Как можно в итоге вытащить и развернуть этот лист тоже?

Answer 1

У FieldInfo есть свойство FieldType - это тип, который вам нужен. Для примера можно сделать так:

Type type = field.FieldType;
if(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
{
    Type itemType = type.GetGenericArguments()[0]; // use this...
}

Ссылки на источники:

  • C# generic list how to get the type of T
  • How to get the type of T from a member of a generic class or method?
  • Свойство FieldInfo.FieldType

Метод GetGenericArguments возвращает массив объектов. Поэтому можно убрать [0] и работать с массивом (к примеру через foreach).

READ ALSO
C#. Как список методов передать в метод?

C#. Как список методов передать в метод?

Помогите разобраться!

189
Как перемешать (случайно переставить) элементы в массиве?

Как перемешать (случайно переставить) элементы в массиве?

Есть данные, записанные в массив или генерируемые на летуКак можно получить их случайную перестановку в массиве или другом контейнере?

187
Log4Net передать лог по почте

Log4Net передать лог по почте

В общем, хочу скинуть лог по почте, когда программа будет на финальной стадии завершения

144
указатели в c#, fixed

указатели в c#, fixed

Есть строка кода в Си:

243