20240326-1

This commit is contained in:
Александр Бабаев 2024-03-26 22:11:15 +03:00
parent 8f6439b7d8
commit 061408763d
8 changed files with 162 additions and 38 deletions

View File

@ -10,7 +10,7 @@ namespace anbs_cp.Classes;
История версий
Обновлено 2024.03.26
* Все интерфейсы объеденены в один IActionStateMessage
* Все интерфейсы объеденины в один IActionStateMessage
Обновлено 2023.12.10
* Заменены классы Action* на соответствующие интерфейсы
@ -434,5 +434,4 @@ public class ActionState<T>: IActionState
Value = value.SetValue<T>();
}
#endregion
}

View File

@ -1,46 +1,37 @@
using anbs_cp.Interfaces;
// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable MemberCanBeInternal
using anbs_cp.Interfaces;
namespace anbs_cp.Classes;
/// <summary>
/// Сериализованная модель значения класса, хранящего в себе состояния действия
/// </summary>
public class ActionStateSerializableValue: ISerializable
public sealed class ActionStateSerializableValue: ISerializable
{
/// <summary>
/// Значение - null?
/// </summary>
private bool IsNull { get; set; }
public bool IsNull { get; set; }
/// <summary>
/// Сериализуемое значение
/// </summary>
private string Serialized { get; set; } = string.Empty;
public string Serialized { get; set; } = string.Empty;
/// <summary>
/// Получает значение из <paramref name="value"/>
/// </summary>
/// <param name="value">Значение</param>
/// <typeparam name="T">Тип значения</typeparam>
public void GetValue<T> (T? value)
internal void GetValue<T> (T? value)
{
// Значение - null?
IsNull = value == null;
IsNull = value is null;
// Если не null
if (value != null)
{
// - значение поддерживает интерфейс IsSerialized
if (value is ISerializable serializableValue)
// -- сериализую
Serialized = serializableValue.Serialize();
else
// -- сериализую
Serialized = new SysTextSerializer().Serialize(value);
}
else
// Сериализую
Serialized = new SysTextSerializer().Serialize(value);
// - сериализую
Serialized = value is not null ? new SysTextSerializer().Serialize(value) : string.Empty;
}
/// <summary>
@ -48,28 +39,43 @@ public class ActionStateSerializableValue: ISerializable
/// </summary>
/// <typeparam name="T">Класс</typeparam>
/// <returns>Значение</returns>
public T? SetValue<T> ()
internal T? SetValue<T> () => IsNull ? default : new SysTextSerializer().Deserialize<T>(Serialized);
/// <summary>
/// Получает значение из <paramref name="value"/>
/// </summary>
/// <param name="value">Значение</param>
/// <typeparam name="T">Тип значения</typeparam>
internal void GetSerializedValue<T> (T? value) where T : ISerializable, new()
{
// Значение - null?
IsNull = value is null;
// Если не null
// - сериализую
Serialized = value is not null ? value.Serialize() : string.Empty;
}
/// <summary>
/// Устанавливает значение
/// </summary>
/// <typeparam name="T">Класс</typeparam>
/// <returns>Значение</returns>
internal T? SetSerializedValue<T> () where T : ISerializable, new()
{
// Если null
if (IsNull)
// - то возыращаем null
// - то возвращаем null
return default;
// Если тип T не реализует интерфейс ISerializable
if (typeof(T).GetInterface(nameof(ISerializable)) == null)
// - то воспользуемся простой десериализацией
return new SysTextSerializer().Deserialize<T>(Serialized);
// Создаю модель
T? model = default;
T model = new ();
// Десериализую модель
(model as ISerializable)?.Deserialize(Serialized);
model.Deserialize(Serialized);
// Возвращаю модель
return model!;
// Если null
return model;
}
#region Реализация интерфейса ISerializable

View File

@ -0,0 +1,116 @@
using anbs_cp.Exceptions;
using anbs_cp.Interfaces;
namespace anbs_cp.Classes;
/// <summary>
/// Состояние действия
///
/// Обновлено 2024.03.26
/// * Добавлен класс ActionState для классов, поддерживаемых интерфейс I
/// </summary>
public sealed class ActionStateSerialized<T>: ActionState<T> where T : ISerializable, new()
{
/// <summary>
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="IActionState"/>).
/// </summary>
/// <param name="state">Запись состояния</param>
public void AddState (ActionStateSerialized<T> state)
{
base.AddState(state);
}
#region Переопределение реализации интерфейса ISerializable
/// <summary>
/// Сериализовать элемент в формат json
/// </summary>
/// <returns>Строка в формате json</returns>
/// <exception cref="SerializeException">Ошибка при сериализации</exception>
public new string Serialize ()
{
// Создаю модель
ActionStateSerializable serializableModel = new();
// Для каждого информационного сообщения
foreach (IActionStateMessage info in Info)
// - добавляю в модель
serializableModel.Info.Add(info.Serialize());
// Для каждого предупреждения
foreach (IActionStateMessage warning in Warnings)
// - добавляю в модель
serializableModel.Info.Add(warning.Serialize());
// Для каждой ошибки
foreach (IActionStateMessage error in Errors)
// - добавляю в модель
serializableModel.Info.Add(error.Serialize());
// Создаю модель значения
ActionStateSerializableValue value = new();
// Получаю данные
value.GetSerializedValue(Value);
// Добавляю в модель
serializableModel.Value = value.Serialize();
// Возвращаю сериализованную модель
return new SysTextSerializer().Serialize(serializableModel);
}
/// <summary>
/// Восстановить элемент из формата json
/// </summary>
/// <param name="json">Строка в формате json</param>
/// <exception cref="SerializeException">Ошибка при десериализации</exception>
public new void Deserialize (string json)
{
// Десериализую строку
ActionStateSerializable itemSerializable = new SysTextSerializer().Deserialize<ActionStateSerializable>(json) ?? new();
// Создаю модель значения
ActionStateSerializableValue value = new();
// Очищаю списки
Info.Clear();
Warnings.Clear();
Errors.Clear();
// Для каждого информационного сообщения
foreach (string infoString in itemSerializable.Info)
{
// - создаю сообщение
ActionStateMessage info = new();
// - десериализую в него данные из модели
info.Deserialize(infoString);
// - добавляю в список
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);
}
// Десериализую данные значения из модели
value.Deserialize(itemSerializable.Value);
// Получаю значение
Value = value.SetSerializedValue<T>();
}
#endregion
}

View File

@ -9,7 +9,7 @@
public sealed class ActionState: ActionState<string>
{
/// <summary>
/// Добавляет другое состояние (например, результат другого действия, который возвращает &lt;see cref="ActionState"/&gt;).
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
/// </summary>
/// <param name="state">Запись состояния</param>
public void AddState (ActionState state)

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Version>2024.3.26</Version>
<Version>2024.3.26.1</Version>
<Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software</Product>
<Description>Библиотека полезных методов языка C#</Description>

View File

@ -23,9 +23,11 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0421_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_043D_043D_0430_044F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0421_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_043D_043D_044B_0435/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0421_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_0442_044C/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0421_0435_0440_0438_0430_043B_0438_0437_0443_0435_043C_043E_0435/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0421_043E_0437_0434_0430_0451_043C/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0432_0432_0435_0434_0451_043D/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0432_0438_0434_0435_043E_043A_0430_0440_0442_0435/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_0435_0439/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_0438/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0441_0435_0440_0438_0430_043B_0438_0437_0430_0446_0438_044F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0434_0435_0448_0438_0444_0440_043E_0432_0430_043D_0438_044F/@EntryIndexedValue">True</s:Boolean>
@ -41,6 +43,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_043D_043D_043E_0433_043E/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_043D_043D_043E_0435/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_043E_0432_0430_043D_043D_0443_044E/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0435_0440_0438_0430_043B_0438_0437_0443_044E/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0441_0447_0451_0442_0447_0438_043A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0445_044D_0448_0430/@EntryIndexedValue">True</s:Boolean>

View File

@ -1,6 +1,6 @@
namespace demo;
partial class ActionStateSerialize
sealed partial class ActionStateSerialize
{
/// <summary>
/// Required designer variable.

View File

@ -2,7 +2,7 @@
namespace demo;
public partial class ActionStateSerialize: Form
public sealed partial class ActionStateSerialize: Form
{
public ActionStateSerialize ()
{
@ -16,7 +16,7 @@ public partial class ActionStateSerialize: Form
Name = textBox1.Text.Length > 0 ? textBox1.Text : string.Empty
};
ActionState<DemoClass> state = new();
ActionState<DemoClass> state = new(demoClass);
state.AddError("ОШИБКА, ШЕФ!");