lab1 - modifed
This commit is contained in:
parent
7bdd5ea8fb
commit
ff464aea76
1
WinFormsLibrary1/WinFormsApp1/Form1.Designer.cs
generated
1
WinFormsLibrary1/WinFormsApp1/Form1.Designer.cs
generated
@ -41,7 +41,6 @@ namespace WinFormsApp1
|
|||||||
//
|
//
|
||||||
// dateInputControl1
|
// dateInputControl1
|
||||||
//
|
//
|
||||||
dateInputControl1.Date = "";
|
|
||||||
dateInputControl1.Location = new Point(13, 107);
|
dateInputControl1.Location = new Point(13, 107);
|
||||||
dateInputControl1.Margin = new Padding(4, 5, 4, 5);
|
dateInputControl1.Margin = new Padding(4, 5, 4, 5);
|
||||||
dateInputControl1.Name = "dateInputControl1";
|
dateInputControl1.Name = "dateInputControl1";
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
this.listBox.Name = "listBox";
|
this.listBox.Name = "listBox";
|
||||||
this.listBox.Size = new System.Drawing.Size(120, 95);
|
this.listBox.Size = new System.Drawing.Size(120, 95);
|
||||||
this.listBox.TabIndex = 0;
|
this.listBox.TabIndex = 0;
|
||||||
this.listBox.SelectedIndexChanged += new System.EventHandler(this.listBox_SelectedIndexChanged);
|
//this.listBox.SelectedIndexChanged += new System.EventHandler(this.listBox_SelectedIndexChanged);
|
||||||
//
|
//
|
||||||
// ListBoxUserControl
|
// ListBoxUserControl
|
||||||
//
|
//
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@ -10,9 +11,9 @@ namespace WinFormsLibrary1
|
|||||||
{
|
{
|
||||||
private string? _template;
|
private string? _template;
|
||||||
|
|
||||||
private string _startSymbol;
|
private char? _startSymbol;
|
||||||
|
|
||||||
private string _endSymbol;
|
private char? _endSymbol;
|
||||||
public int SelectedIndex
|
public int SelectedIndex
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -28,7 +29,7 @@ namespace WinFormsLibrary1
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
public void SetParams(string template, string fromChar, string toChar)
|
public void SetParams(string template, char? fromChar, char? toChar)
|
||||||
{
|
{
|
||||||
_template = template;
|
_template = template;
|
||||||
_startSymbol = fromChar;
|
_startSymbol = fromChar;
|
||||||
@ -37,62 +38,81 @@ namespace WinFormsLibrary1
|
|||||||
|
|
||||||
public T? GetObject<T>() where T : class, new()
|
public T? GetObject<T>() where T : class, new()
|
||||||
{
|
{
|
||||||
if (listBox.SelectedIndex == -1)
|
if (listBox.SelectedIndex == -1 || string.IsNullOrEmpty(_template) || !_startSymbol.HasValue || !_endSymbol.HasValue)
|
||||||
|
throw new ArgumentException("Не хватает данных");
|
||||||
|
|
||||||
|
var type = typeof(T);
|
||||||
|
var fields = type.GetFields();
|
||||||
|
var properties = type.GetProperties();
|
||||||
|
var members = fields.Cast<MemberInfo>().Concat(properties.Cast<MemberInfo>()).ToArray();
|
||||||
|
|
||||||
|
var curObject = new T();
|
||||||
|
string text = listBox.SelectedItem?.ToString() ?? "";
|
||||||
|
|
||||||
|
var words = System.Text.RegularExpressions.Regex.Split(_template, $@"\{_startSymbol.Value}.*?\{_endSymbol.Value}");
|
||||||
|
|
||||||
|
int firstWordStart = text.IndexOf(words[0], 0);
|
||||||
|
if (firstWordStart == -1)
|
||||||
|
throw new Exception("Не найден элемент шаблона");
|
||||||
|
if (firstWordStart != 0)
|
||||||
{
|
{
|
||||||
return null;
|
string beginning = text[..firstWordStart];
|
||||||
|
FillMember(_template.Substring(1, firstWordStart - 2), curObject, beginning, members);
|
||||||
}
|
}
|
||||||
|
|
||||||
string selectedString = listBox.SelectedItem.ToString()!;
|
int start = 0;
|
||||||
T obj = new T();
|
|
||||||
|
|
||||||
string pattern = $@"{Regex.Escape(_startSymbol)}(.*?){Regex.Escape(_endSymbol)}";
|
for (int i = 0; i < words.Length - 1; i++)
|
||||||
MatchCollection matches = Regex.Matches(_template, pattern);
|
|
||||||
|
|
||||||
string[] words = selectedString.Split(' ');
|
|
||||||
|
|
||||||
int wordIndex = 0;
|
|
||||||
|
|
||||||
foreach (Match match in matches)
|
|
||||||
{
|
{
|
||||||
string propertyName = match.Groups[1].Value;
|
start = text.IndexOf(words[i], start);
|
||||||
var property = obj.GetType().GetProperty(propertyName);
|
if (start == -1)
|
||||||
if (property != null && property.CanWrite)
|
throw new Exception("Не найден элемент шаблона");
|
||||||
{
|
start += words[i].Length;
|
||||||
if (wordIndex < words.Length)
|
|
||||||
{
|
int nextWordIndex = text.IndexOf(words[i + 1], start);
|
||||||
string propertyValue = words[wordIndex];
|
if (nextWordIndex == -1)
|
||||||
property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType));
|
throw new Exception("Не найден следующий элемент шаблона");
|
||||||
wordIndex++;
|
|
||||||
|
string valueBetween = text[start..nextWordIndex];
|
||||||
|
|
||||||
|
string layoutPart = _template.Substring(_template.IndexOf(words[i]) + words[i].Length);
|
||||||
|
int startCharIndex = layoutPart.IndexOf(_startSymbol.Value);
|
||||||
|
int endCharIndex = layoutPart.IndexOf(_endSymbol.Value);
|
||||||
|
string memberName = layoutPart.Substring(startCharIndex + 1, endCharIndex - startCharIndex - 1);
|
||||||
|
|
||||||
|
FillMember(memberName, curObject, valueBetween, members);
|
||||||
|
|
||||||
|
start = nextWordIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (T?)curObject;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetMemberValue(object obj, MemberInfo member, object value)
|
||||||
|
{
|
||||||
|
if (member is PropertyInfo property)
|
||||||
|
{
|
||||||
|
property.SetValue(obj, value);
|
||||||
|
}
|
||||||
|
else if (member is FieldInfo field)
|
||||||
|
{
|
||||||
|
field.SetValue(obj, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
private void FillMember(string memberName, object curObject, string value, MemberInfo[]? members)
|
||||||
|
{
|
||||||
|
var member = members?.FirstOrDefault(x => x.Name == memberName)
|
||||||
|
?? throw new Exception("Ошибка с поиском элемента");
|
||||||
|
object convertedValue = Convert.ChangeType(value, GetMemberType(member));
|
||||||
|
|
||||||
|
SetMemberValue(curObject, member, convertedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddObject<T>(T obj)
|
private Type GetMemberType(MemberInfo member)
|
||||||
{
|
{
|
||||||
if (obj == null)
|
return member is PropertyInfo property ? property.PropertyType : ((FieldInfo)member).FieldType;
|
||||||
{
|
|
||||||
throw new ArgumentNullException("Добавляемый объект не существует!");
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(_template) || string.IsNullOrEmpty(_startSymbol) || string.IsNullOrEmpty(_endSymbol))
|
|
||||||
{
|
|
||||||
throw new Exception("Заполните макетную строку!");
|
|
||||||
}
|
|
||||||
if (!_template.Contains(_startSymbol) || !_template.Contains(_endSymbol))
|
|
||||||
{
|
|
||||||
throw new Exception("Макетная строка не содержит нужные элементы!");
|
|
||||||
}
|
|
||||||
|
|
||||||
string processedString = _template;
|
|
||||||
foreach (var property in obj.GetType().GetProperties())
|
|
||||||
{
|
|
||||||
string placeholder = $"{_startSymbol}{property.Name}{_endSymbol}";
|
|
||||||
processedString = processedString.Replace(placeholder, $"{_startSymbol}{property.GetValue(obj)}{_endSymbol}");
|
|
||||||
}
|
|
||||||
|
|
||||||
listBox.Items.Add(processedString);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user