From f19ee998af5ea8280e41c0409f910f0f1343cda2 Mon Sep 17 00:00:00 2001 From: babaev-an Date: Thu, 28 Mar 2024 14:08:59 +0300 Subject: [PATCH] 20240328 --- anbs_cp/Classes/ActionState.cs | 247 ++++++--------------- anbs_cp/Classes/ActionStateMessage.cs | 202 +++++++---------- anbs_cp/Classes/ActionStateSerializable.cs | 14 +- anbs_cp/Classes/ActionStateSerialized.cs | 48 +--- anbs_cp/anbs_cp.csproj | 2 +- 5 files changed, 166 insertions(+), 347 deletions(-) diff --git a/anbs_cp/Classes/ActionState.cs b/anbs_cp/Classes/ActionState.cs index eb83ce1..ed42f80 100644 --- a/anbs_cp/Classes/ActionState.cs +++ b/anbs_cp/Classes/ActionState.cs @@ -9,7 +9,10 @@ namespace anbs_cp.Classes; /* История версий - + Обновлено 2024.03.28 + * Все поля Errors, Warnings и Infos объеденены в одно Messages + * В ActionStateMessage добавлен параметр, определяющий тип: MessageType + Обновлено 2024.03.26 * Все интерфейсы объеденины в один класс ActionStateMessage * Интерфейс IActionState удалён @@ -27,48 +30,33 @@ namespace anbs_cp.Classes; */ /// -public class ActionState: ISerializable +public class ActionState (T? defaultValue = default): ISerializable { - /// - /// Конструктор по умолчанию - /// - // ReSharper disable once MemberCanBeProtected.Global - public ActionState () - { - Messages = []; - Value = default; - } - - /// - /// Конструктор с указанием начального значения - /// - /// Начальное значение - public ActionState (T defaultValue) - { - Messages = []; - Value = defaultValue; - } - /// /// Список информации /// - public List Messages { get; } + // ReSharper disable once CollectionNeverQueried.Local + internal List Messages { get; } = []; /// /// Значение /// - public T? Value { get; set; } + public T? Value { get; set; } = defaultValue; + + /// + /// Метод для выбора всех значений для условия + /// + // ReSharper disable once StaticMemberInGenericType + public static readonly Func SelectAll = _ => true; #region Методы - #region Очистка /// /// Очищает список ошибок /// public void ClearErrors () { - Errors.Clear(); - Errors.TrimExcess(); + Clear(message => message.MessageType == EActionStateMessageType.Error); } /// @@ -76,8 +64,7 @@ public class ActionState: ISerializable /// public void ClearWarnings () { - Warnings.Clear(); - Warnings.TrimExcess(); + Clear(message => message.MessageType == EActionStateMessageType.Warning); } /// @@ -85,18 +72,22 @@ public class ActionState: ISerializable /// public void ClearInfo () { - Info.Clear(); - Info.TrimExcess(); + Clear(message => message.MessageType == EActionStateMessageType.Information); } /// - /// Очищает все списки + /// Очищает список по условию /// - public void Clear () + /// Условие выборки + public void Clear (Func predicate) { - ClearInfo(); - ClearWarnings(); - ClearErrors(); + // Получаю список элементов + IEnumerable list = Messages.Where(predicate); + + // Для каждого элемента + foreach (ActionStateMessage actionStateMessage in list) + // - запускаю его удаление + Messages.Remove(actionStateMessage); } #endregion @@ -116,39 +107,21 @@ public class ActionState: ISerializable public void AddRange (IEnumerable messages) => Messages.AddRange(messages); #endregion + #region Добавление ошибки /// /// Добавление ошибки /// /// Является ли ошибка критической - public void AddError (bool critical = true) - { - //Создаю ошибку - ActionStateMessage error = new("", critical) - { - MessageType = EActionStateMessageType.Error - }; - - //Добавляю ошибку - Add(error); - } + public void AddError (bool critical = true) => Add(new(EActionStateMessageType.Error, critical)); /// /// Добавление ошибки /// /// Сообщение об ошибке /// Является ли ошибка критической - public void AddError (string message, bool critical = true) - { - //Создаю ошибку - ActionStateMessage error = new(message, critical) - { - MessageType = EActionStateMessageType.Error - }; - - //Добавляю ошибку - Add(error); - } + public void AddError (string message, bool critical = true) => + Add(new(EActionStateMessageType.Error, critical, message: message)); /// /// Добавление ошибки @@ -156,73 +129,28 @@ public class ActionState: ISerializable /// Объект ошибки /// Сообщение об ошибке /// /// Является ли ошибка критической - public void AddError (string errorObject, string message, bool critical = true) - { - //Создаю ошибку - ActionStateMessage error = new(errorObject, message, critical) - { - MessageType = EActionStateMessageType.Error - }; + public void AddError (string errorObject, string message, bool critical = true) => + Add(new(EActionStateMessageType.Error, critical, errorObject, message)); - //Добавляю ошибку - Add(error); - } #endregion #region Добавление предупреждения - /// - /// Добавление предупреждения - /// - /// Предупреждение - public void AddWarning (ActionStateMessage warning) => Warnings.Add(warning); - - /// - /// Добавление предупреждений - /// - /// Список предупреждений - public void AddWarnings (IEnumerable warnings) => Warnings.AddRange(warnings); - /// /// Добавление предупреждение /// /// Текст предупреждения /// Объект предупреждения - public void AddWarning (string message, string warningObject = "") - { - //Создаю предупреждение - ActionStateMessage warning = new(warningObject, message); - - //Добавляю предупреждение - AddWarning(warning); - } + public void AddWarning (string message, string warningObject = "") => + Add(new(EActionStateMessageType.Warning, message: message, obj: warningObject)); #endregion #region Добавление информации - /// - /// Добавление информации - /// - /// Информация - public void AddInfo (ActionStateMessage info) => Info.Add(info); - - /// - /// Добавление информации - /// - /// Список информации - public void AddInfos (IEnumerable infos) => Info.AddRange(infos); - /// /// Добавление информации /// /// Текст информации /// Объект информации - public void AddInfo (string message, string infoObject = "") - { - //Создаю информацию - ActionStateMessage info = new(infoObject, message); - - //Добавляю информацию - AddInfo(info); - } + public void AddInfo (string message, string infoObject = "") => Add(new(message: message, obj: infoObject)); #endregion #region Печать @@ -243,22 +171,20 @@ public class ActionState: ISerializable switch (area) { case EActionStatePrintArea.All: - list.AddRange(Errors); - list.AddRange(Warnings); - list.AddRange(Info); + list.AddRange(Messages); break; case EActionStatePrintArea.ErrorsAndWarnings: - list.AddRange(Errors); - list.AddRange(Warnings); + list.AddRange(Messages.Where(message => + message.MessageType is EActionStateMessageType.Error or EActionStateMessageType.Warning)); break; case EActionStatePrintArea.ErrorsOnly: - list.AddRange(Errors); + list.AddRange(Messages.Where(message => message.MessageType == EActionStateMessageType.Error)); break; case EActionStatePrintArea.WarningsOnly: - list.AddRange(Warnings); + list.AddRange(Messages.Where(message => message.MessageType == EActionStateMessageType.Warning)); break; case EActionStatePrintArea.InfosOnly: - list.AddRange(Info); + list.AddRange(Messages.Where(message => message.MessageType == EActionStateMessageType.Information)); break; default: throw new ArgumentOutOfRangeException(nameof(area), area, null); @@ -278,24 +204,24 @@ public class ActionState: ISerializable /// /// Игнорировать не критические /// Наличие ошибок - public bool HasErrors (bool ignoreNonCritical = false) => - ignoreNonCritical ? Errors.Any(static error => error.IsCritical) : Errors.Any(); + public bool HasErrors (bool ignoreNonCritical = false) => Messages.Any(message => + message.MessageType == EActionStateMessageType.Error && (!ignoreNonCritical || !message.IsCritical)); /// /// Проверяет, есть ли предупреждения /// /// Игнорировать информационные предупреждения /// Наличие предупреждений - public bool HasWarnings (bool ignoreInformWarning = false) => ignoreInformWarning - ? Warnings.Any(static warning => warning.IsCritical) - : Warnings.Any(); + public bool HasWarnings (bool ignoreInformWarning = false) => Messages.Any(message => + message.MessageType == EActionStateMessageType.Warning && (!ignoreInformWarning || !message.IsCritical)); /// /// Проверяет, есть ли сообщения /// /// Игнорировать статусные сообщения /// Наличие сообщений - public bool HasInfo (bool ignoreStatus) => ignoreStatus ? Info.Any(static info => info.IsCritical) : Info.Any(); + public bool HasInfo (bool ignoreStatus) => Messages.Any(message => + message.MessageType == EActionStateMessageType.Information && (!ignoreStatus || !message.IsCritical)); /// /// Успешно ли завершилось @@ -305,46 +231,45 @@ public class ActionState: ISerializable #endregion #region Количество сообщений + /// + /// Количество сообщений, удовлеьворяющих условию + /// + /// Условие выборки + /// Число сообщений + public int Count (Func predicate) => Messages.Count(predicate); + /// /// Количество ошибок /// /// Игнорировать не критические /// Количество ошибок - public int ErrorsCount (bool ignoreNonCritical = false) => - ignoreNonCritical ? Errors.Count(static error => error.IsCritical) : Errors.Count; + public int ErrorsCount (bool ignoreNonCritical = false) => Count(message => + message.MessageType == EActionStateMessageType.Error && (!ignoreNonCritical || !message.IsCritical)); /// /// Количество предупреждений /// /// Игнорировать информационные предупреждения /// Количество предупреждений - public int WarningsCount (bool ignoreInformWarning = false) => ignoreInformWarning - ? Warnings.Count(static warning => warning.IsCritical) - : Warnings.Count; + public int WarningsCount (bool ignoreInformWarning = false) => Count(message => + message.MessageType == EActionStateMessageType.Warning && (!ignoreInformWarning || !message.IsCritical)); /// /// Количество информационных сообщений /// /// Игнорировать статусные сообщения /// Количество информационных сообщений - public int InfoCount (bool ignoreStatus) => ignoreStatus - ? Info.Count(static info => info.IsCritical) - : Info.Count; + public int InfoCount (bool ignoreStatus) => Count(message => + message.MessageType == EActionStateMessageType.Information && (!ignoreStatus || !message.IsCritical)); #endregion #region Добавление другого состояния - /// /// Добавляет другое состояние (например, результат другого действия, который возвращает ). /// /// Тип параметра /// Запись состояния - public void AddState (ActionState state) - { - AddErrors(state.Errors); - AddWarnings(state.Warnings); - AddInfos(state.Info); - } + public void AddState (ActionState state) => AddRange(state.Messages); #endregion #endregion @@ -355,20 +280,10 @@ public class ActionState: ISerializable // Создаю модель ActionStateSerializable serializableModel = new(); - // Для каждого информационного сообщения - foreach (ActionStateMessage info in Info) + // Для каждого сообщения + foreach (ActionStateMessage message in Messages) // - добавляю в модель - serializableModel.Info.Add(info.Serialize()); - - // Для каждого предупреждения - foreach (ActionStateMessage warning in Warnings) - // - добавляю в модель - serializableModel.Info.Add(warning.Serialize()); - - // Для каждой ошибки - foreach (ActionStateMessage error in Errors) - // - добавляю в модель - serializableModel.Info.Add(error.Serialize()); + serializableModel.Messages.Add(message.Serialize()); // Создаю модель значения ActionStateSerializableValue value = new(); @@ -397,37 +312,17 @@ public class ActionState: ISerializable ActionStateSerializableValue value = new(); // Очищаю списки - Info.Clear(); - Warnings.Clear(); - Errors.Clear(); + Clear(SelectAll); - // Для каждого информационного сообщения - foreach (string infoString in itemSerializable.Info) + // Для каждого сообщения + foreach (string messageString in itemSerializable.Messages) { // - создаю сообщение - ActionStateMessage info = new(); + ActionStateMessage message = new(); // - десериализую в него данные из модели - info.Deserialize(infoString); + message.Deserialize(messageString); // - добавляю в список - Info.Add(info); - } - foreach (string warningString in itemSerializable.Warnings) - { - // - создаю сообщение - ActionStateMessage warning = new(); - // - десериализую в него данные из модели - warning.Deserialize(warningString); - // - добавляю в список - Info.Add(warning); - } - foreach (string errorString in itemSerializable.Errors) - { - // - создаю сообщение - ActionStateMessage error = new(); - // - десериализую в него данные из модели - error.Deserialize(errorString); - // - добавляю в список - Info.Add(error); + Add(message); } // Десериализую данные значения из модели diff --git a/anbs_cp/Classes/ActionStateMessage.cs b/anbs_cp/Classes/ActionStateMessage.cs index 61c6ec0..6c63e75 100644 --- a/anbs_cp/Classes/ActionStateMessage.cs +++ b/anbs_cp/Classes/ActionStateMessage.cs @@ -9,143 +9,107 @@ namespace anbs_cp.Classes; /// /// Класс сообщения состояния /// -public sealed class ActionStateMessage: ISerializable +public sealed class ActionStateMessage ( + EActionStateMessageType type = EActionStateMessageType.Information, + bool isCritical = false, + string obj = "", + string message = ""): ISerializable { - #region Свойства - /// - /// Тип сообщения - /// - public EActionStateMessageType MessageType { get; set; } = EActionStateMessageType.Information; + #region Свойства + /// + /// Тип сообщения + /// + public EActionStateMessageType MessageType { get; set; } = type; - /// - /// Критичность сообщения - /// - public bool IsCritical { get; set; } + /// + /// Критичность сообщения + /// + public bool IsCritical { get; set; } = isCritical; - /// - /// Объект сообщения - /// - public string Object { get; set; } + /// + /// Объект сообщения + /// + public string Object { get; set; } = obj; - /// - /// Текст сообщения - /// - public string Message { get; set; } + /// + /// Текст сообщения + /// + public string Message { get; set; } = message; - #endregion + #endregion - #region Конструкторы + #region Методы - /// - /// Конструктор по умолчанию - /// - // ReSharper disable once MemberCanBePrivate.Global - public ActionStateMessage () - { - IsCritical = true; - Object = "Not Implemented"; - Message = "Not Implemented"; - } + /// + /// Вывод сообщения + /// + /// Строка-форматирование (например, «[{0}] - {1}») + /// Отформатированную строка + public string PrintMessage (string format) => string.Format(format, Object, Message); - /// - /// Конструктор с 2 параметрами - /// - /// Сообщение - /// Критичность сообщения - public ActionStateMessage (string message, bool isCritical = true) - { - IsCritical = isCritical; - Object = ""; - Message = message; - } - - /// - /// Конструктор с 3 параметрами - /// - /// Объект сообщения - /// Сообщение - /// Критичность сообщения - public ActionStateMessage (string eObject, string message, bool isCritical = true) - { - IsCritical = isCritical; - Object = eObject; - Message = message; - } - - #endregion - - #region Методы - - /// - /// Вывод сообщения - /// - /// Строка-форматирование (например, «[{0}] - {1}») - /// Отформатированную строка - public string PrintMessage (string format) => string.Format(format, Object, Message); - - /// - /// Устанавливает объект - /// - /// Объект - /// Тип объекта - public void SetObject (T obj) - { - // Если объект реализует интерфейс ISerializable - if (obj is ISerializable serializable) + /// + /// Устанавливает объект + /// + /// Объект + /// Тип объекта + public void SetObject (T obj) { - // - то сериализуем его методами интерфейса - Object = serializable.Serialize(); - // - и прерываем - return; + // Если объект реализует интерфейс ISerializable + if (obj is ISerializable serializable) + { + // - то сериализуем его методами интерфейса + Object = serializable.Serialize(); + // - и прерываем + return; + } + + // Сериализуем объект с помощью NewtonsoftJson + Object = new NewtonsoftJsonSerializer().Serialize(obj); } - // Сериализуем объект с помощью NewtonsoftJson - Object = new NewtonsoftJsonSerializer().Serialize(obj); - } + /// + /// Получает объект + /// + /// Класс объекта + /// Объект или null + public T? GetObject () => new NewtonsoftJsonSerializer().Deserialize(Object); - /// - /// Получает объект - /// - /// Класс объекта - /// Объект или null - public T? GetObject () => new NewtonsoftJsonSerializer().Deserialize(Object); + /// + /// Получает объект + /// + /// Класс объекта, реализующий интерфейс ISerializable + /// Объект + public T GetSerializedObject () where T : ISerializable, new() + { + // Создаём результирующую модель + T model = new(); - /// - /// Получает объект - /// - /// Класс объекта, реализующий интерфейс ISerializable - /// Объект - public T GetSerializedObject () where T : ISerializable, new() - { - // Создаём результирующую модель - T model = new(); + // Десериализуем её методами интерфейса ISerializable + model.Deserialize(Object); - // Десериализуем её методами интерфейса ISerializable - model.Deserialize(Object); + // Возвращаем модель + return model; + } - // Возвращаем модель - return model; - } + #endregion - #endregion + #region Реализация интерфейса ISerializable - #region Реализация интерфейса ISerializable + /// + public string Serialize () => new NewtonsoftJsonSerializer().Serialize(this); - /// - public string Serialize () => new NewtonsoftJsonSerializer().Serialize(this); + /// + public void Deserialize (string json) + { + // Десериализую строку + ActionStateMessage item = new NewtonsoftJsonSerializer().Deserialize(json) ?? new(); - /// - public void Deserialize (string json) - { - // Десериализую строку - ActionStateMessage item = new NewtonsoftJsonSerializer().Deserialize(json) ?? new(); + // Передаю параметры + MessageType = item.MessageType; + IsCritical = item.IsCritical; + Object = item.Object; + Message = item.Message; + } - // Передаю параметры - MessageType = item.MessageType; - IsCritical = item.IsCritical; - Object = item.Object; - Message = item.Message; - } - - #endregion + #endregion } \ No newline at end of file diff --git a/anbs_cp/Classes/ActionStateSerializable.cs b/anbs_cp/Classes/ActionStateSerializable.cs index 36a814b..dd61c52 100644 --- a/anbs_cp/Classes/ActionStateSerializable.cs +++ b/anbs_cp/Classes/ActionStateSerializable.cs @@ -7,19 +7,9 @@ namespace anbs_cp.Classes; public class ActionStateSerializable { /// - /// Список информации + /// Список всех сообщений /// - public List Info { get; } = []; - - /// - /// Список предупреждений - /// - public List Warnings { get; } = []; - - /// - /// Список ошибок - /// - public List Errors { get; } = []; + public List Messages { get; } = []; /// /// Значение diff --git a/anbs_cp/Classes/ActionStateSerialized.cs b/anbs_cp/Classes/ActionStateSerialized.cs index 401fa85..e5958bb 100644 --- a/anbs_cp/Classes/ActionStateSerialized.cs +++ b/anbs_cp/Classes/ActionStateSerialized.cs @@ -31,20 +31,10 @@ public sealed class ActionStateSerialized: ActionState where T : ISerializ // Создаю модель ActionStateSerializable serializableModel = new(); - // Для каждого информационного сообщения - foreach (ActionStateMessage info in Info) + // Для каждого сообщения + foreach (ActionStateMessage message in Messages) // - добавляю в модель - serializableModel.Info.Add(info.Serialize()); - - // Для каждого предупреждения - foreach (ActionStateMessage warning in Warnings) - // - добавляю в модель - serializableModel.Info.Add(warning.Serialize()); - - // Для каждой ошибки - foreach (ActionStateMessage error in Errors) - // - добавляю в модель - serializableModel.Info.Add(error.Serialize()); + serializableModel.Messages.Add(message.Serialize()); // Создаю модель значения ActionStateSerializableValue value = new(); @@ -73,37 +63,17 @@ public sealed class ActionStateSerialized: ActionState where T : ISerializ ActionStateSerializableValue value = new(); // Очищаю списки - Info.Clear(); - Warnings.Clear(); - Errors.Clear(); + Clear(SelectAll); - // Для каждого информационного сообщения - foreach (string infoString in itemSerializable.Info) + // Для каждого сообщения + foreach (string messageString in itemSerializable.Messages) { // - создаю сообщение - ActionStateMessage info = new(); + ActionStateMessage message = new(); // - десериализую в него данные из модели - info.Deserialize(infoString); + message.Deserialize(messageString); // - добавляю в список - Info.Add(info); - } - foreach (string warningString in itemSerializable.Warnings) - { - // - создаю сообщение - ActionStateMessage warning = new(); - // - десериализую в него данные из модели - warning.Deserialize(warningString); - // - добавляю в список - Info.Add(warning); - } - foreach (string errorString in itemSerializable.Errors) - { - // - создаю сообщение - ActionStateMessage error = new(); - // - десериализую в него данные из модели - error.Deserialize(errorString); - // - добавляю в список - Info.Add(error); + Add(message); } // Десериализую данные значения из модели diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index 1474a2e..171c061 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -2,7 +2,7 @@ net8.0 - 2024.3.27.2 + 2024.3.28 Александр Бабаев Набор компонентов ANB Software Библиотека полезных методов языка C#