using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace VisualComponentsLib { public partial class MyListBoxObjects : UserControl { //Макетная строка private string layoutString; //начальный символ для обнаружения свойств/полей private string startSymbol; //конечный символ для обнаружения свойств/полей private string endSymbol; public MyListBoxObjects() { InitializeComponent(); } //Метод для установки информации о макетной строке и символах (начального и конечного) public void SetLayoutInfo(string layout, string startS, string endS) { if (layout == null || startS == null || endS == null) { return; } layoutString = layout; startSymbol = startS; endSymbol = endS; } //свойство для получения и заполнения индекса выбранного элемента public int SelectedIndex { get { if (listBoxObj.SelectedIndex == -1) { return -1; } return listBoxObj.SelectedIndex; } set { if (listBoxObj.SelectedItems.Count != 0) { listBoxObj.SelectedIndex = value; } } } //Публичный параметризованный метод для получения объекта из выбранной строки(создать объект и через рефлексию заполнить свойства его). public T GetObjectFromStr() where T : class, new() { string selStr = ""; if (listBoxObj.SelectedIndex != -1) { selStr = listBoxObj.SelectedItem.ToString(); } T curObject = new T(); foreach (var pr in typeof(T).GetProperties()) { if (!pr.CanWrite) { continue; } int borderOne = selStr.IndexOf(startSymbol); StringBuilder sb = new StringBuilder(selStr); sb[borderOne] = 'z'; selStr = sb.ToString(); int borderTwo = selStr.IndexOf(endSymbol); if (borderOne == -1 || borderTwo == -1) break; string propertyValue = selStr.Substring(borderOne + 1, borderTwo - borderOne - 1); selStr = selStr.Substring(borderTwo + 1); pr.SetValue(curObject, Convert.ChangeType(propertyValue, pr.PropertyType)); } return curObject; } //параметризованный метод, у которого в передаваемых параметрах идет список объектов некого класса и через этот список идет заполнение ListBox; public void AddInListBox(List objects) { if (layoutString == null || startSymbol == null || endSymbol == null) { MessageBox.Show("заполните информацию о макетной строке"); return; } if (!layoutString.Contains(startSymbol) || !layoutString.Contains(endSymbol)) { MessageBox.Show("Макетная строка не содержит нужные элементы"); return; } foreach (var item in objects) { string str = layoutString; foreach (var prop in item.GetType().GetProperties()) { string str1 = $"{startSymbol}" + $"{prop.Name}" + $"{endSymbol}"; str = str.Replace(str1, $"{startSymbol}" + prop.GetValue(item).ToString() + $"{endSymbol}"); } listBoxObj.Items.Add(str); } } } }