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#