20240326-1
This commit is contained in:
parent
8f6439b7d8
commit
061408763d
@ -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
|
||||
|
||||
}
|
@ -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
|
||||
|
116
anbs_cp/Classes/ActionStateSerialized.cs
Normal file
116
anbs_cp/Classes/ActionStateSerialized.cs
Normal 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
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
public sealed class ActionState: ActionState<string>
|
||||
{
|
||||
/// <summary>
|
||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
||||
/// </summary>
|
||||
/// <param name="state">Запись состояния</param>
|
||||
public void AddState (ActionState state)
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
2
demo/ActionStateSerialize.Designer.cs
generated
2
demo/ActionStateSerialize.Designer.cs
generated
@ -1,6 +1,6 @@
|
||||
namespace demo;
|
||||
|
||||
partial class ActionStateSerialize
|
||||
sealed partial class ActionStateSerialize
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
|
@ -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("ОШИБКА, ШЕФ!");
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user