Перебирать объекты внутри объекта - PullRequest
0 голосов
/ 07 мая 2020

У меня есть класс Alarms, который содержит несколько Lists разных моделей. Каждая модель отличается, и они состоят из нескольких свойств строк. Моя цель - создать файл CSV для каждой модели, но без кодирования каждого отдельного строкового свойства в моей модели.

public class Alarms
{
   public List<SectorA> SectorA { get; set; } = new List<SectorA>();
   public List<SectorB> SectorB { get; set; } = new List<SectorB>();
   public List<SectorC> SectorC { get; set; } = new List<SectorC>();
}

Я нашел способ циклически перебирать свойства строки, например:

foreach (PropertyInfo prop in alarms.GetType().GetProperties())
{
    var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
    if (type == typeof(string))
    {
        line += $"{prop.GetValue(lines, null)};";
    }
}

Мой вопрос: как я могу циклически пройти через мой Alarm класс, чтобы получить каждый List<SectorX> внутри него за один l oop?

Изменить: Пример one SectorX class

public class SectorA
{
    public string Id { get; set; }
    public string Group { get; set; }
    public string Comment { get; set; }
    ...
}

Edit # 2 Вот функция, которую я должен l oop через класс, чтобы получить его свойства

public void WriteCsv<T>(string csvOutputPath, List<object> sectors)
{
    using (var w = new StreamWriter(csvOutputPath))
    {
        foreach (var lines in sectors)
        {
            string line = "";
            foreach (PropertyInfo prop in lines.GetType().GetProperties())
            {
                var type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
                if (type == typeof(string))
                {
                    line += $"{prop.GetValue(lines, null)};";
                }
            }

            line = line.Remove(line.Length - 1);

            w.WriteLine(line);
            w.Flush();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Не лучший способ, но

private void Test(object item)
{
    var props = item.GetType().GetProperties();
    foreach (var prop in props)
    {
        object value = prop.GetValue(item);
        if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(List<>) && value != null)
        // if (prop.PropertyType.IsInterface && value != null)
        {
            foreach (var iItem in (System.Collections.IEnumerable)value)
            {
                Console.WriteLine(iItem.ToString());
            }
        }
    }
}
0 голосов
/ 07 мая 2020

Может быть, здесь поможет метод GetFields ().

using System;
using System.Collections.Generic;
using System.Reflection;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Type objType = typeof(Alarms);

            BindingFlags bindingFlags = BindingFlags.Public |
                            BindingFlags.NonPublic |
                            BindingFlags.Instance |
                            BindingFlags.Static;

            FieldInfo[] fieldInfos = objType.GetFields(bindingFlags);

            for (int i = 0; i < fieldInfos.Length; i++)
                Console.WriteLine(" {0}", fieldInfos[i]);

            Console.ReadKey();
        }
    }
}

public class Alarms
{
    public List<SectorA> SectorA { get; set; } = new List<SectorA>();
}

public class SectorA
    {
        public string Id { get; set; }
        public string Group { get; set; }
        public string Comment { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...