using System.Reflection; using System.Text.RegularExpressions; using static System.Net.Mime.MediaTypeNames; namespace ComponentsLibrary { public partial class ListBoxValues : UserControl { private string layoutString = string.Empty; private char startSymbol = '{'; private char endSymbol = '}'; private List items = new List(); private EventHandler? _getObject; public ListBoxValues() { InitializeComponent(); } //событие, вызываемое при выборе строки public event EventHandler GetObject { add { _getObject += value; } remove { _getObject -= value; } } private void listBox_SelectedIndexChanged(object sender, EventArgs e) { _getObject?.Invoke(this, e); } //Публичное свойство для установки и получения индекса выбранной строки (set, get). public int SelectedIndex { get { return listBox.SelectedIndex; } set { listBox.SelectedIndex = value; } } // Публичный метод для установки макетной строки и символов public void SetLayout(string layout, char startChar, char endChar) { layoutString = layout; startSymbol = startChar; endSymbol = endChar; } // Публичный метод для заполнения ListBox public void FillListBox(IEnumerable itemList) { listBox.Items.Clear(); items.Clear(); foreach (var item in itemList) { if (item != null) { items.Add(item); string displayText = CreateDisplayText(item); listBox.Items.Add(displayText); } } } // Метод для создания строки на основе макета private string CreateDisplayText(object item) { string text = layoutString; PropertyInfo[] properties = item.GetType().GetProperties(); foreach (var prop in properties) { string propertyValue = prop.GetValue(item)?.ToString() ?? string.Empty; text = text.Replace("{" + prop.Name + "}", propertyValue); } return text; } // Публичный параметризованный метод для получения объекта из выбранной строки public T? GetSelectedItem() where T : new() { var item = listBox.SelectedItem; if (item != null) { PropertyInfo[] properties = typeof(T).GetProperties(); string layout = layoutString; string pattern = @"^(.*?){T}.*?(.*?){P}"; //string input2 = "Температура воздуха ТЕМПЕРАТУРА ВЫСОКАЯ, давление НИЗКОЕ"; string? selectedString = item?.ToString(); if (selectedString != null) { T obj = new T(); Regex regex = new Regex(pattern); Match match = regex.Match(layout); string[] staticText = new string[properties.Length]; if (match.Success) { // Извлекаем текст до {T} и до {P} //string beforeT = match.Groups[1].Value; //string beforeP = match.Groups[2].Value; for (int i = 0; i < staticText.Length; i++) { staticText[i] = match.Groups[i+1].Value; } //string pattern2 = $@"{beforeT}(.*?)\{beforeP}(.*)\{beforeEnd}"; //"Температура воздуха (.*?)\\, давление (.*)\\, такие дела" string patternStatic = $@""; for (int i = 0; i < staticText.Length; i++) { if (i == staticText.Length - 1) { patternStatic += $"{staticText[i]}(.*)"; } else { patternStatic += $"{staticText[i]}(.*?)\\"; } } Regex regexValues = new Regex(patternStatic); Match matchValues = regexValues.Match(selectedString); if (matchValues.Success) { //object val1 = matchValues.Groups[1].Value; //object val2 = matchValues.Groups[2].Value; for (int i = 0; i < properties.Length; i++) { object value = Convert.ChangeType(matchValues.Groups[i+1].Value, properties[i].PropertyType); properties[i].SetValue(obj, value); } return obj; } } } } return default; } } }