20221130
This commit is contained in:
parent
5872049cc7
commit
f0acfce2f3
63
anbs_cp/Classes/ActionError.cs
Normal file
63
anbs_cp/Classes/ActionError.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс ошибки
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ActionError: IActionError
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Критичность ошибки:
|
||||||
|
/// при некритичных ошибках продолжение выполнения операции возможно,
|
||||||
|
/// а при критичных -- нет
|
||||||
|
/// </summary>
|
||||||
|
public bool IsCritical { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объект ошибки
|
||||||
|
/// </summary>
|
||||||
|
public object Object { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сообщение об ошибке
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
#region Конструкторы
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор по умолчанию
|
||||||
|
/// </summary>
|
||||||
|
public ActionError ()
|
||||||
|
{
|
||||||
|
IsCritical = true;
|
||||||
|
Object = "Not Implemented";
|
||||||
|
Message = "Not Implemented";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор с 2 параметрами
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">Сообщение</param>
|
||||||
|
/// <param name="isCritical">Критичность ошибки</param>
|
||||||
|
public ActionError (string message, bool isCritical = true)
|
||||||
|
{
|
||||||
|
IsCritical = isCritical;
|
||||||
|
Object = "";
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор с 3 параметрами
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eObject">Объект ошибки</param>
|
||||||
|
/// <param name="message">Сообщение</param>
|
||||||
|
/// <param name="isCritical">Критичность ошибки</param>
|
||||||
|
public ActionError (object eObject, string message, bool isCritical = true)
|
||||||
|
{
|
||||||
|
IsCritical = isCritical;
|
||||||
|
Object = eObject;
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
49
anbs_cp/Classes/ActionInfo.cs
Normal file
49
anbs_cp/Classes/ActionInfo.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
using anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс предупреждения
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ActionInfo: IActionInfo
|
||||||
|
{
|
||||||
|
#region Конструкторы
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор по умолчанию
|
||||||
|
/// </summary>
|
||||||
|
public ActionInfo ()
|
||||||
|
{
|
||||||
|
IsStatusInfo = false;
|
||||||
|
Object = string.Empty;
|
||||||
|
Message = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eObject">Объект</param>
|
||||||
|
/// <param name="message">Сообщение</param>
|
||||||
|
/// <param name="isStatus">Является статусной информацией?</param>
|
||||||
|
public ActionInfo (string eObject, string message, bool isStatus = false)
|
||||||
|
{
|
||||||
|
IsStatusInfo = isStatus;
|
||||||
|
Object = eObject;
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Реализация интерфейса
|
||||||
|
/// <summary>
|
||||||
|
/// Объект
|
||||||
|
/// </summary>
|
||||||
|
public object Object { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Сообщение
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Статусная информация (например, начало работы)
|
||||||
|
/// </summary>
|
||||||
|
public bool IsStatusInfo { get; init; }
|
||||||
|
#endregion
|
||||||
|
}
|
299
anbs_cp/Classes/ActionState.cs
Normal file
299
anbs_cp/Classes/ActionState.cs
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
using anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Состояние действия
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ActionState
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор
|
||||||
|
/// </summary>
|
||||||
|
public ActionState ()
|
||||||
|
{
|
||||||
|
Info = new();
|
||||||
|
Warnings = new();
|
||||||
|
Errors = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список информации
|
||||||
|
/// </summary>
|
||||||
|
public List<IActionInfo> Info { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список предупреждений
|
||||||
|
/// </summary>
|
||||||
|
public List<IActionWarning> Warnings { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список ошибок
|
||||||
|
/// </summary>
|
||||||
|
public List<IActionError> Errors { get; }
|
||||||
|
|
||||||
|
#region Методы
|
||||||
|
|
||||||
|
#region Очистка
|
||||||
|
/// <summary>
|
||||||
|
/// Очищает список ошибок
|
||||||
|
/// </summary>
|
||||||
|
public void ClearErrors ()
|
||||||
|
{
|
||||||
|
Errors.Clear();
|
||||||
|
Errors.TrimExcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очищает список предупреждений
|
||||||
|
/// </summary>
|
||||||
|
public void ClearWarnings ()
|
||||||
|
{
|
||||||
|
Warnings.Clear();
|
||||||
|
Warnings.TrimExcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очищает список информации
|
||||||
|
/// </summary>
|
||||||
|
public void ClearInfo ()
|
||||||
|
{
|
||||||
|
Info.Clear();
|
||||||
|
Info.TrimExcess();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Очищает все списки
|
||||||
|
/// </summary>
|
||||||
|
public void Clear ()
|
||||||
|
{
|
||||||
|
ClearInfo();
|
||||||
|
ClearWarnings();
|
||||||
|
ClearErrors();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Добавление ошибки
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление ошибки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="error">Ошибка</param>
|
||||||
|
// ReSharper disable once MemberCanBeMadeStatic.Global
|
||||||
|
// ReSharper disable once FunctionRecursiveOnAllPaths
|
||||||
|
public void AddError (IActionError error) => AddError(error);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавляет ошибки в список
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="errors">Список ошибок</param>
|
||||||
|
public void AddErrors(IEnumerable<IActionError> errors) => Errors.AddRange(errors);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление ошибки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="critical">Является ли ошибка критической</param>
|
||||||
|
public void AddError (bool critical = true)
|
||||||
|
{
|
||||||
|
//Создаю ошибку
|
||||||
|
ActionError error = new("", critical);
|
||||||
|
|
||||||
|
//Добавляю ошибку
|
||||||
|
AddError(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление ошибки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">Сообщение об ошибке</param>
|
||||||
|
/// <param name="critical">Является ли ошибка критической</param>
|
||||||
|
public void AddError (string message, bool critical = true)
|
||||||
|
{
|
||||||
|
//Создаю ошибку
|
||||||
|
ActionError error = new(message, critical);
|
||||||
|
|
||||||
|
//Добавляю ошибку
|
||||||
|
AddError(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление ошибки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="errorObject">Объект ошибки</param>
|
||||||
|
/// <param name="message">Сообщение об ошибке</param>
|
||||||
|
/// /// <param name="critical">Является ли ошибка критической</param>
|
||||||
|
public void AddError (string errorObject, string message, bool critical = true)
|
||||||
|
{
|
||||||
|
//Создаю ошибку
|
||||||
|
ActionError error = new(errorObject, message, critical);
|
||||||
|
|
||||||
|
//Добавляю ошибку
|
||||||
|
AddError(error);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Добавление предупреждения
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление предупреждения
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="warning">Предупреждение</param>
|
||||||
|
public void AddWarning (IActionWarning warning) => Warnings.Add(warning);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление предупреждений
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="warnings">Список предупреждений</param>
|
||||||
|
public void AddWarnings(IEnumerable<IActionWarning> warnings) => Warnings.AddRange(warnings);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление предупреждение
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">Текст предупреждения</param>
|
||||||
|
/// <param name="warningObject">Объект предупреждения</param>
|
||||||
|
public void AddWarning (string message, string warningObject = "")
|
||||||
|
{
|
||||||
|
//Создаю предупреждение
|
||||||
|
ActionWarning warning = new(warningObject, message);
|
||||||
|
|
||||||
|
//Добавляю предупреждение
|
||||||
|
AddWarning(warning);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Добавление информации
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление информации
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="info">Информация</param>
|
||||||
|
public void AddInfo (IActionInfo info) => Info.Add(info);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление информации
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="infos">Список информации</param>
|
||||||
|
public void AddInfos (IEnumerable<IActionInfo> infos) => Info.AddRange(infos);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Добавление информации
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message">Текст информации</param>
|
||||||
|
/// <param name="warningObject">Объект информации</param>
|
||||||
|
public void AddInfo (string message, string warningObject = "")
|
||||||
|
{
|
||||||
|
//Создаю информацию
|
||||||
|
ActionInfo info = new(warningObject, message);
|
||||||
|
|
||||||
|
//Добавляю информацию
|
||||||
|
AddInfo(info);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Печать
|
||||||
|
/// <summary>
|
||||||
|
/// Печать списка ошибок
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="formatList">Формат списка</param>
|
||||||
|
/// <param name="formatItem">Формат элемента списка</param>
|
||||||
|
/// <returns>Список ошибок в текстовой форме</returns>
|
||||||
|
public string PrintErrorList (string formatList, string formatItem)
|
||||||
|
{
|
||||||
|
string elements =
|
||||||
|
#pragma warning disable CS8625
|
||||||
|
Errors.Aggregate<IActionError, string>(null, (current, error) => current + error.PrintMessage(formatItem));
|
||||||
|
#pragma warning restore CS8625
|
||||||
|
|
||||||
|
return string.Format(formatList, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Печать списка предупреждений
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="formatList">Формат списка</param>
|
||||||
|
/// <param name="formatItem">Формат элемента списка</param>
|
||||||
|
/// <returns>Список предупреждений в текстовой форме</returns>
|
||||||
|
public string PrintWarningList (string formatList, string formatItem)
|
||||||
|
{
|
||||||
|
string elements =
|
||||||
|
#pragma warning disable CS8625
|
||||||
|
Warnings.Aggregate<IActionWarning, string>(null,
|
||||||
|
#pragma warning restore CS8625
|
||||||
|
(current, warning) => current + warning.PrintMessage(formatItem));
|
||||||
|
|
||||||
|
return string.Format(formatList, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Печать списка информации
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="formatList">Формат списка</param>
|
||||||
|
/// <param name="formatItem">Формат элемента списка</param>
|
||||||
|
/// <returns>Список информации в текстовой форме</returns>
|
||||||
|
public string PrintInfoList (string formatList, string formatItem)
|
||||||
|
{
|
||||||
|
string elements =
|
||||||
|
#pragma warning disable CS8625
|
||||||
|
Info.Aggregate<IActionInfo, string>(null, (current, info) => current + info.PrintMessage(formatItem));
|
||||||
|
#pragma warning restore CS8625
|
||||||
|
|
||||||
|
return string.Format(formatList, elements);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Проверка на наличие
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет, есть ли ошибки
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreNonCritical">Игнорировать не критические</param>
|
||||||
|
/// <returns>Наличие ошибок</returns>
|
||||||
|
public bool HasErrors (bool ignoreNonCritical = false) =>
|
||||||
|
ignoreNonCritical ? Errors.Any(static error => error.IsCritical) : Errors.Any();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет, есть ли предупреждения
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreInformWarning">Игнорировать информационные предупреждения</param>
|
||||||
|
/// <returns>Наличие предупреждений</returns>
|
||||||
|
public bool HasWarnings (bool ignoreInformWarning = false) => ignoreInformWarning
|
||||||
|
? Warnings.Any(static warning => !warning.IsInformWarning)
|
||||||
|
: Warnings.Any();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет, есть ли сообщения
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreStatus">Игнорировать статусные сообщения</param>
|
||||||
|
/// <returns>Наличие сообщений</returns>
|
||||||
|
public bool HasInfo (bool ignoreStatus) => ignoreStatus ? Info.Any(static info => !info.IsStatusInfo) : Info.Any();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Успешно ли завершилось
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSuccess (bool ignoreNonCriticalErrors = false) =>
|
||||||
|
!HasErrors(ignoreNonCriticalErrors) && !HasWarnings(true);
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Количество сообщений
|
||||||
|
/// <summary>
|
||||||
|
/// Количество ошибок
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreNonCritical">Игнорировать не критические</param>
|
||||||
|
/// <returns>Количество ошибок</returns>
|
||||||
|
public int ErrorsCount (bool ignoreNonCritical = false) =>
|
||||||
|
ignoreNonCritical ? Errors.Count(static error => error.IsCritical) : Errors.Count;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество предупреждений
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreInformWarning">Игнорировать информационные предупреждения</param>
|
||||||
|
/// <returns>Количество предупреждений</returns>
|
||||||
|
public int WarningsCount (bool ignoreInformWarning = false) => ignoreInformWarning
|
||||||
|
? Warnings.Count(static warning => !warning.IsInformWarning)
|
||||||
|
: Warnings.Count;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Количество информационных сообщений
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ignoreStatus">Игнорировать статусные сообщения</param>
|
||||||
|
/// <returns>Количество информационных сообщений</returns>
|
||||||
|
public int InfoCount (bool ignoreStatus) => ignoreStatus ? Info.Count(static info => !info.IsStatusInfo) : Info.Count;
|
||||||
|
#endregion
|
||||||
|
#endregion
|
||||||
|
}
|
49
anbs_cp/Classes/ActionWarning.cs
Normal file
49
anbs_cp/Classes/ActionWarning.cs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
using anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Класс предупреждения
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ActionWarning: IActionWarning
|
||||||
|
{
|
||||||
|
#region Конструкторы
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор по умолчанию
|
||||||
|
/// </summary>
|
||||||
|
public ActionWarning ()
|
||||||
|
{
|
||||||
|
IsInformWarning = false;
|
||||||
|
Object = string.Empty;
|
||||||
|
Message = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Конструктор
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eObject">Объект</param>
|
||||||
|
/// <param name="message">Сообщение</param>
|
||||||
|
/// <param name="isInform">Является ли информирующим предупреждением</param>
|
||||||
|
public ActionWarning (string eObject, string message, bool isInform = false)
|
||||||
|
{
|
||||||
|
IsInformWarning = isInform;
|
||||||
|
Object = eObject;
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Реализация интерфейса
|
||||||
|
/// <summary>
|
||||||
|
/// Объект
|
||||||
|
/// </summary>
|
||||||
|
public object Object { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Сообщение
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Информирующее предупреждение возникает для предупреждения ВОЗМОЖНОЙ ошибки в дальнейшей эксплуатации и не влияет на текущую операцию.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsInformWarning { get; init; }
|
||||||
|
#endregion
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Форматирует число элементов в понятную строку
|
/// Форматирует число элементов в понятную строку
|
||||||
@ -10,7 +10,7 @@ public sealed class CountFormatter : IValueFormatter
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Имена чисел (тысяч, миллионов, миллиардов и т.п.)
|
/// Имена чисел (тысяч, миллионов, миллиардов и т.п.)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] CountNames { get; set; } = {"", "тыс.", "млн.", "млрд."};
|
public string[] CountNames { get; set; } = { "", "тыс.", "млн.", "млрд." };
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Знаков после запятой
|
/// Знаков после запятой
|
||||||
@ -20,7 +20,7 @@ public sealed class CountFormatter : IValueFormatter
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Делители чисел
|
/// Делители чисел
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long[] Delimeters { get; set; } = {1000, 1000000, 1000000000};
|
public long[] Delimeters { get; set; } = { 1000, 1000000, 1000000000 };
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Форматирует размер файла/папки в понятную строку
|
/// Форматирует размер файла/папки в понятную строку
|
||||||
@ -10,7 +10,7 @@ public class FileSizeFormatter : IValueFormatter
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Имена размеров (байт, килобайт, мегабайт, гигабайт и террабайт)
|
/// Имена размеров (байт, килобайт, мегабайт, гигабайт и террабайт)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string[] SizeNames { get; set; } = {"Байт", "Кб", "Мб", "Гб", "Тб"};
|
public string[] SizeNames { get; set; } = { "Байт", "Кб", "Мб", "Гб", "Тб" };
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Знаков после запятой
|
/// Знаков после запятой
|
||||||
@ -55,7 +55,7 @@ public class FileSizeFormatter : IValueFormatter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public long[] MaxSizes
|
public long[] MaxSizes
|
||||||
{
|
{
|
||||||
get => new[] {ByteMax, KByteMax, MByteMax, GByteMax};
|
get => new[] { ByteMax, KByteMax, MByteMax, GByteMax };
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
ByteMax = value[0];
|
ByteMax = value[0];
|
@ -1,4 +1,4 @@
|
|||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Форматирует размерности в понятную строку
|
/// Форматирует размерности в понятную строку
|
||||||
@ -65,7 +65,7 @@ public interface IValueFormatter
|
|||||||
|
|
||||||
for (int i = 0; i <= DecimalPlaces; i++) delim *= 10;
|
for (int i = 0; i <= DecimalPlaces; i++) delim *= 10;
|
||||||
|
|
||||||
decimal value = Math.Round((decimal) (dividend * delim / divider)) / delim;
|
decimal value = Math.Round((decimal)(dividend * delim / divider)) / delim;
|
||||||
|
|
||||||
return $"{value}";
|
return $"{value}";
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Класс, добавляющий реализацию некоторых методов Delphi, которые упрощают работу в C#.
|
/// Класс, добавляющий реализацию некоторых методов Delphi, которые упрощают работу в C#.
|
||||||
@ -10,7 +10,7 @@ public static class LikeDelphi
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path">Путь, к которому нужно добавить slash</param>
|
/// <param name="path">Путь, к которому нужно добавить slash</param>
|
||||||
/// <returns>Путь со slash в конце</returns>
|
/// <returns>Путь со slash в конце</returns>
|
||||||
public static string IncludeTrailingBackslash (string path)
|
public static string IncludeTrailingBackslash(string path)
|
||||||
{
|
{
|
||||||
//По умолчанию сохраняем путь
|
//По умолчанию сохраняем путь
|
||||||
string result = path;
|
string result = path;
|
||||||
@ -29,5 +29,5 @@ public static class LikeDelphi
|
|||||||
/// <param name="str">Строка, которую нужно разбить</param>
|
/// <param name="str">Строка, которую нужно разбить</param>
|
||||||
/// <param name="delimiter">Символ-делитель строки</param>
|
/// <param name="delimiter">Символ-делитель строки</param>
|
||||||
/// <returns>Массив строк</returns>
|
/// <returns>Массив строк</returns>
|
||||||
public static List<string> ParseString (string str, char delimiter) => str.Split (delimiter).ToList();
|
public static List<string> ParseString(string str, char delimiter) => str.Split(delimiter).ToList();
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Класс перевода одинаковых свойств из класса TF в класс T.
|
/// Класс перевода одинаковых свойств из класса TF в класс T.
|
||||||
@ -19,7 +19,7 @@ public static class SimpleMapper
|
|||||||
/// <param name="list">Список параметров для сопоставления</param>
|
/// <param name="list">Список параметров для сопоставления</param>
|
||||||
/// <typeparam name="TF">Класс-родитель</typeparam>
|
/// <typeparam name="TF">Класс-родитель</typeparam>
|
||||||
/// <typeparam name="T">Класс-приемник</typeparam>
|
/// <typeparam name="T">Класс-приемник</typeparam>
|
||||||
public static void MapEx<TF, T> (TF from, ref T to, MapMode mode, List<string> list)
|
public static void MapEx<TF, T>(TF from, ref T to, MapMode mode, List<string> list)
|
||||||
{
|
{
|
||||||
//Копирую поля
|
//Копирую поля
|
||||||
Type typeOfA = typeof(TF);
|
Type typeOfA = typeof(TF);
|
||||||
@ -58,7 +58,7 @@ public static class SimpleMapper
|
|||||||
/// <typeparam name="TF">Класс-родитель</typeparam>
|
/// <typeparam name="TF">Класс-родитель</typeparam>
|
||||||
/// <typeparam name="T">Класс-приемник</typeparam>
|
/// <typeparam name="T">Класс-приемник</typeparam>
|
||||||
/// <returns>Элемент класса T</returns>
|
/// <returns>Элемент класса T</returns>
|
||||||
public static T Map<TF, T> (TF from)
|
public static T Map<TF, T>(TF from)
|
||||||
{
|
{
|
||||||
//Создаю элемент
|
//Создаю элемент
|
||||||
// ReSharper disable once NullableWarningSuppressionIsUsed
|
// ReSharper disable once NullableWarningSuppressionIsUsed
|
||||||
@ -77,7 +77,7 @@ public static class SimpleMapper
|
|||||||
/// <param name="mode">Режим проверки</param>
|
/// <param name="mode">Режим проверки</param>
|
||||||
/// <param name="list">Список игнорирования/добавления</param>
|
/// <param name="list">Список игнорирования/добавления</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private static bool CheckCondition<T> (string itemName, object? itemValue, MapMode mode, ICollection<string> list)
|
private static bool CheckCondition<T>(string itemName, object? itemValue, MapMode mode, ICollection<string> list)
|
||||||
{
|
{
|
||||||
//Если режим "Только список" и поля нет в списке,
|
//Если режим "Только список" и поля нет в списке,
|
||||||
//либо режим "Только не в списке" и поле есть в списке
|
//либо режим "Только не в списке" и поле есть в списке
|
||||||
@ -85,7 +85,8 @@ public static class SimpleMapper
|
|||||||
//или режим "Только не по умолчанию" и значение по умолчанию
|
//или режим "Только не по умолчанию" и значение по умолчанию
|
||||||
//то пропускаем
|
//то пропускаем
|
||||||
bool result =
|
bool result =
|
||||||
mode switch {
|
mode switch
|
||||||
|
{
|
||||||
MapMode.MapFull => true,
|
MapMode.MapFull => true,
|
||||||
MapMode.MapNotNull => itemValue != null,
|
MapMode.MapNotNull => itemValue != null,
|
||||||
MapMode.MapByList => list.Contains(itemName),
|
MapMode.MapByList => list.Contains(itemName),
|
@ -1,4 +1,4 @@
|
|||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Класс проверки временного интервала
|
/// Класс проверки временного интервала
|
||||||
@ -9,14 +9,14 @@ public static class TimestampValidator
|
|||||||
/// Проверка попадания в заданный интервал (в мс)
|
/// Проверка попадания в заданный интервал (в мс)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="timestamp">Временной интервал</param>
|
/// <param name="timestamp">Временной интервал</param>
|
||||||
/// <param name="checkedstamp">Проверяемый временной интервал</param>
|
/// <param name="checkedStamp">Проверяемый временной интервал</param>
|
||||||
/// <param name="deltams">Временная дельта в миллисекундах</param>
|
/// <param name="deltaMs">Временная дельта в миллисекундах</param>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// Попал ли <paramref name="checkedstamp" /> в промежуток <paramref name="timestamp" /> +
|
/// Попал ли <paramref name="checkedStamp" /> в промежуток <paramref name="timestamp" /> +
|
||||||
/// <paramref name="deltams" />
|
/// <paramref name="deltaMs" />
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public static bool Validate(long timestamp, long checkedstamp, ulong deltams) =>
|
public static bool Validate(long timestamp, long checkedStamp, ulong deltaMs) =>
|
||||||
new TimeSpan(timestamp) + TimeSpan.FromMilliseconds(deltams) > new TimeSpan(checkedstamp);
|
new TimeSpan(timestamp) + TimeSpan.FromMilliseconds(deltaMs) > new TimeSpan(checkedStamp);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка попадания текущего времени в заданный интервал (в мс)
|
/// Проверка попадания текущего времени в заданный интервал (в мс)
|
@ -1,7 +1,7 @@
|
|||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using Microsoft.AspNetCore.Html;
|
using Microsoft.AspNetCore.Html;
|
||||||
|
|
||||||
namespace anbs_cp;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Конвертер типов на манер Delphi
|
/// Конвертер типов на манер Delphi
|
||||||
@ -117,7 +117,7 @@ public static class TypeConverter
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="content">Значение, которое нужно преобразовать.</param>
|
/// <param name="content">Значение, которое нужно преобразовать.</param>
|
||||||
/// <returns><see cref="string"/></returns>
|
/// <returns><see cref="string"/></returns>
|
||||||
public static string HtmlContentToString (IHtmlContent content)
|
public static string HtmlContentToString(IHtmlContent content)
|
||||||
{
|
{
|
||||||
//Создаём writer
|
//Создаём writer
|
||||||
using StringWriter writer = new();
|
using StringWriter writer = new();
|
14
anbs_cp/Interfaces/IActionError.cs
Normal file
14
anbs_cp/Interfaces/IActionError.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интерфейс ошибки
|
||||||
|
/// </summary>
|
||||||
|
public interface IActionError : IActionStateMessage
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Критичность ошибки:
|
||||||
|
/// при некритичных ошибках продолжение выполнения операции возможно,
|
||||||
|
/// а при критичных -- нет
|
||||||
|
/// </summary>
|
||||||
|
public bool IsCritical { get; init; }
|
||||||
|
}
|
12
anbs_cp/Interfaces/IActionInfo.cs
Normal file
12
anbs_cp/Interfaces/IActionInfo.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интерфейс для информации по статусу
|
||||||
|
/// </summary>
|
||||||
|
public interface IActionInfo : IActionStateMessage
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Статусная информация (например, начало работы)
|
||||||
|
/// </summary>
|
||||||
|
public bool IsStatusInfo { get; init; }
|
||||||
|
}
|
24
anbs_cp/Interfaces/IActionStateMessage.cs
Normal file
24
anbs_cp/Interfaces/IActionStateMessage.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
namespace anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интерфейс сообщения состояния
|
||||||
|
/// </summary>
|
||||||
|
public interface IActionStateMessage
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Объект сообщения
|
||||||
|
/// </summary>
|
||||||
|
public object Object { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Текст сообщения
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Функция вывода сообщения
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="format">Строка-форматирование (например, «[{0}] - {1}»)</param>
|
||||||
|
/// <returns>Отформатированную строка</returns>
|
||||||
|
public string PrintMessage (string format) => string.Format (format, Object, Message);
|
||||||
|
}
|
12
anbs_cp/Interfaces/IActionWarning.cs
Normal file
12
anbs_cp/Interfaces/IActionWarning.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace anbs_cp.Interfaces;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Интерфейс предупреждения
|
||||||
|
/// </summary>
|
||||||
|
public interface IActionWarning : IActionStateMessage
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Информирующее предупреждение возникает для предупреждения ВОЗМОЖНОЙ ошибки в дальнейшей эксплуатации и не влияет на текущую операцию.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsInformWarning { get; init; }
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<Version>1.2022.1028</Version>
|
<Version>1.2022.1130</Version>
|
||||||
<Authors>Alexander Babaev</Authors>
|
<Authors>Alexander Babaev</Authors>
|
||||||
<Product>ANB Software Components Pack</Product>
|
<Product>ANB Software Components Pack</Product>
|
||||||
<Description>Library of some useful functions in C# language.</Description>
|
<Description>Library of some useful functions in C# language.</Description>
|
||||||
@ -12,29 +12,31 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||||
<SignAssembly>False</SignAssembly>
|
<SignAssembly>True</SignAssembly>
|
||||||
<PackageProjectUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</PackageProjectUrl>
|
<PackageProjectUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</RepositoryUrl>
|
<RepositoryUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</RepositoryUrl>
|
||||||
<AssemblyVersion>1.2022.1028</AssemblyVersion>
|
<AssemblyVersion>1.2022.1130</AssemblyVersion>
|
||||||
<FileVersion>1.2022.1028</FileVersion>
|
<FileVersion>1.2022.1130</FileVersion>
|
||||||
<PackageId>ANBSoftware.ComponentsPack</PackageId>
|
<PackageId>ANBSoftware.ComponentsPack</PackageId>
|
||||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
<AnalysisLevel>6.0</AnalysisLevel>
|
<AnalysisLevel>6.0</AnalysisLevel>
|
||||||
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<WarningLevel>2</WarningLevel>
|
<WarningLevel>7</WarningLevel>
|
||||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
<WarningLevel>2</WarningLevel>
|
<WarningLevel>7</WarningLevel>
|
||||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop" Version="17.1.32210.191" />
|
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop" Version="17.4.33103.184" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
2
anbs_cp/anbs_cp.csproj.DotSettings
Normal file
2
anbs_cp/anbs_cp.csproj.DotSettings
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp110</s:String></wpf:ResourceDictionary>
|
2
demo/CountValueTest.Designer.cs
generated
2
demo/CountValueTest.Designer.cs
generated
@ -1,6 +1,6 @@
|
|||||||
namespace demo;
|
namespace demo;
|
||||||
|
|
||||||
partial class CountValueTest
|
sealed partial class CountValueTest
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
using anbs_cp;
|
using anbs_cp.Classes;
|
||||||
|
|
||||||
namespace demo;
|
namespace demo;
|
||||||
|
|
||||||
public partial class CountValueTest: Form
|
public sealed partial class CountValueTest: Form
|
||||||
{
|
{
|
||||||
public CountValueTest ()
|
public CountValueTest ()
|
||||||
{
|
{
|
||||||
|
@ -1,14 +1,4 @@
|
|||||||
using System;
|
namespace demo;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace demo;
|
|
||||||
public sealed partial class MainMenu: Form
|
public sealed partial class MainMenu: Form
|
||||||
{
|
{
|
||||||
public MainMenu ()
|
public MainMenu ()
|
||||||
|
4
demo/SampleMapperTest.Designer.cs
generated
4
demo/SampleMapperTest.Designer.cs
generated
@ -88,7 +88,7 @@ sealed partial class SampleMapperTest
|
|||||||
// ResultArea
|
// ResultArea
|
||||||
//
|
//
|
||||||
this.ResultArea.Dock = System.Windows.Forms.DockStyle.Right;
|
this.ResultArea.Dock = System.Windows.Forms.DockStyle.Right;
|
||||||
this.ResultArea.Location = new System.Drawing.Point(811, 0);
|
this.ResultArea.Location = new System.Drawing.Point(819, 0);
|
||||||
this.ResultArea.Multiline = true;
|
this.ResultArea.Multiline = true;
|
||||||
this.ResultArea.Name = "ResultArea";
|
this.ResultArea.Name = "ResultArea";
|
||||||
this.ResultArea.ReadOnly = true;
|
this.ResultArea.ReadOnly = true;
|
||||||
@ -150,7 +150,7 @@ sealed partial class SampleMapperTest
|
|||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(1143, 378);
|
this.ClientSize = new System.Drawing.Size(1151, 378);
|
||||||
this.Controls.Add(this.MapModeLabel);
|
this.Controls.Add(this.MapModeLabel);
|
||||||
this.Controls.Add(this.MapModeEdit);
|
this.Controls.Add(this.MapModeEdit);
|
||||||
this.Controls.Add(this.DemoDateTimeLabel);
|
this.Controls.Add(this.DemoDateTimeLabel);
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using anbs_cp;
|
using anbs_cp.Classes;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace demo;
|
namespace demo;
|
||||||
|
@ -57,9 +57,4 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="SampleMapperTest_MapBtn_Click_" xml:space="preserve">
|
|
||||||
<value>Demo2 Class before map:
|
|
||||||
{0}
|
|
||||||
and after:{1}</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
</root>
|
@ -2,13 +2,12 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<TargetFramework>net6.0-windows10.0.22000.0</TargetFramework>
|
<TargetFramework>net7.0-windows</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Configurations>Release;Debug.CNF</Configurations>
|
<Configurations>Release;Debug.CNF</Configurations>
|
||||||
<SupportedOSPlatformVersion>7.0</SupportedOSPlatformVersion>
|
<StartupObject>demo.Program</StartupObject>
|
||||||
<StartupObject></StartupObject>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
@ -20,7 +19,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user