У меня есть класс 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> внутри него находился в одном цикле ?

Редактировать: Пример одного SectorX класса

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

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

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();
        }
    }
}
c#
0
RegularNormalDayGuy 7 Май 2020 в 22:04

2 ответа

Лучший ответ

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

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());
            }
        }
    }
}
1
Mertuarez 7 Май 2020 в 19:54

Может быть, метод 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; }
    }
0
NicolaiNi 7 Май 2020 в 19:48