Динамическое создание типа для коллекции - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Есть такая задумка, но не знаю как реализовать. Файл электронной таблицы, в котором допустим есть 10 колонок, моя программа не знает о количестве и названиях колонок. Описание этой таблицы находится во внешнем файле, условно

config.xml

. Хочу сделать либо

Struct

, либо

Class

, в которых буду описывать тип моей электронной таблицы(названия колонок). Допустим мне надо из 10 колонок только 5 использовать для работы. Какие именно колонки надо использовать я беру из файла

settings.xml

вот ещё был мой вопрос и ещё моя тема
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Xml.Linq;
  6. using ExcelLibrary;
  7. using DocumentFormat.OpenXml.Packaging;
  8. namespace XML_Parser
  9. {
  10. struct DataArray
  11. {
  12. public string Type_1;
  13. public string Type_2;
  14. public string Type_3;
  15. public string Type_4;
  16. public string Type_5;
  17. public string Type_6;
  18. public string Type_7;
  19. public string Type_8;
  20. public string Type_9;
  21. public string Type_10;
  22. public DataArray(string type_1, string type_2, string type_3, string type_4, string type_5, string type_6, string type_7, string type_8, string type_9, string type_10)
  23. {
  24. Type_1 = type_1;
  25. Type_2 = type_2;
  26. Type_3 = type_3;
  27. Type_4 = type_4;
  28. Type_5 = type_5;
  29. Type_6 = type_6;
  30. Type_7 = type_7;
  31. Type_8 = type_8;
  32. Type_9 = type_9;
  33. Type_10 = type_10;
  34. }
  35. class ConvertSelectetdFile
  36. {
  37. List<DataArray> workList = new List<DataArray>();
  38.  
  39. ........................некий код, который работает с этой коллекцией..........................
  40.  
  41. }
Я могу жестко прописать тип моей структуры и использовать только нужные в данный момент поля. Но если состав электронной таблицы изменится, то мне придётся переписывать код, а хочется сделать универсальную программу, в которой структура

DataArray

создавалась бы на основе файла настроек и ещё лучше, если только нужные поля электронной таблицы считывать и записывать значения в поля динамически созданной

DataArray

. В общем как можно создать типизированную коллекцию

List<DataArray>

, в которой тип получается и создаётся из файла настроек. Программа не знает ничего, а только использует файла настроек. Спасибо!

Решение задачи: «Динамическое создание типа для коллекции»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace XML_Parser
  7. {
  8.     /// <summary>
  9.     /// Класс для загрузки и работы с параметрами файлов.
  10.     /// Здесь можно будет выбирать какие колонки необходимо
  11.     /// обрабатывать, а какие нужно скрыть
  12.     /// </summary>
  13.     [Serializable]
  14.     public class Column
  15.     {
  16.         public string Parameter { get; set; }
  17.         public string value { get; set; }
  18.  
  19.         public Column()
  20.         { }
  21.  
  22.         public Column(string _param, string _value)
  23.         {
  24.             Parameter = _param;
  25.             value = _value;
  26.         }
  27.     }
  28. }
  29.  
  30. using System;
  31. using System.Collections.Generic;
  32. using System.ComponentModel;
  33. using System.Text;
  34. using System.Data;
  35. using System.IO;
  36. using System.Xml.Linq;
  37. using Excel;
  38.  
  39. namespace XML_Parser
  40. {
  41.     /// <summary>
  42.     /// Класс, в котором будет проводится чтение заданного файла с учётом параметров(заданных колонок)
  43.     /// </summary>
  44.     class ReadSelectedFile
  45.     {
  46.         private Dictionary<string, Sele_2> _dictionary;
  47.         //создание делегата метода принимающего путь к файлу, отдельный поток выполнения и файл настроек нужных колонок
  48.         private delegate List<Column[]> Sele_2(string path, System.ComponentModel.BackgroundWorker worker, List<Column> preset);
  49.         //контейнер в котором будем хранить данные из загруженного файла электронной таблицы с учётом нужных колонок
  50.         private List<Column[]> result = new List<Column[]>();
  51.         public ReadSelectedFile()
  52.         {
  53.             _dictionary = new Dictionary<string, Sele_2>
  54.             {
  55.                 {".xls", pars_xls},
  56.                 {".xlsx",  pars_xlsx},
  57.                 {".xml", pars_xml },
  58.             };
  59.         }
  60.  
  61.        
  62.          private List<Column[]> pars_xml(string path, BackgroundWorker worker, List<Column> preset)
  63.         {            
  64.             XNamespace o = "urn:schemas-microsoft-com:office:office";
  65.             XNamespace x = "urn:schemas-microsoft-com:office:excel";
  66.             XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet";
  67.             XDocument xDoc;
  68.             try
  69.             {
  70.                 xDoc = XDocument.Load(path);
  71.             }
  72.             catch (Exception exp)
  73.             {
  74.                 throw;
  75.             }
  76.             //список заголовков колонок, значения которых надо использовать
  77.             List<string> tempNameColumn = new List<string>();
  78.            
  79.             foreach (var item in xDoc.Descendants(ss + "Row").ElementAt(0).Elements())
  80.             {
  81.                 //проводим сравнение название колонки со списком настроек, нужно ли использовать колонку или нет
  82.                 if (Convert.ToBoolian(item.Find((xx) => xx==(preset.Preset).value))
  83.                  {
  84.                     tempNameColumn.Add(item.Value);
  85.                   }              
  86.             }
  87.  
  88.              //создаем массив колонок для одной строки в списке List<Column[]>
  89.             Column[] tempColumn = new Column[tempNameColumn.Count];
  90.             foreach (XElement item in xDoc.Descendants(ss + "Row"))
  91.             {
  92.                 int i = 0;
  93.                 foreach (var item_2 in item.Elements())
  94.                 {
  95.                     tempColumn[i] = new Column();
  96.                     tempColumn[i].Parameter = tempNameColumn[i];
  97.                     tempColumn[i].value = item_2.Value;
  98.                     i++;
  99.                 }
  100.                 result.Add(tempColumn);
  101.             }
  102.             result.RemoveAt(0);
  103.            return result;
  104.         }
  105.  
  106.        
  107.         private List<Column[]> pars_xlsx(string path, BackgroundWorker worker, List<Column> preset)
  108.         {            
  109.            ...........
  110.         }
  111.        
  112.             private List<Column[]> pars_xls(string path, BackgroundWorker worker, List<Column> preset)
  113.         {
  114.             ................
  115.         }
  116.  
  117.         internal List<Column[]> Read(string path, BackgroundWorker backgroundWorker, List<Column> list)
  118.         {
  119.             return _dictionary[Path.GetExtension(path)](path, backgroundWorker, list);
  120.         }
  121.     }
  122. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы