20240326-1
This commit is contained in:
parent
8f6439b7d8
commit
061408763d
@ -10,7 +10,7 @@ namespace anbs_cp.Classes;
|
|||||||
История версий
|
История версий
|
||||||
|
|
||||||
Обновлено 2024.03.26
|
Обновлено 2024.03.26
|
||||||
* Все интерфейсы объеденены в один IActionStateMessage
|
* Все интерфейсы объеденины в один IActionStateMessage
|
||||||
|
|
||||||
Обновлено 2023.12.10
|
Обновлено 2023.12.10
|
||||||
* Заменены классы Action* на соответствующие интерфейсы
|
* Заменены классы Action* на соответствующие интерфейсы
|
||||||
@ -434,5 +434,4 @@ public class ActionState<T>: IActionState
|
|||||||
Value = value.SetValue<T>();
|
Value = value.SetValue<T>();
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
@ -1,46 +1,37 @@
|
|||||||
using anbs_cp.Interfaces;
|
// ReSharper disable MemberCanBePrivate.Global
|
||||||
|
// ReSharper disable MemberCanBeInternal
|
||||||
|
using anbs_cp.Interfaces;
|
||||||
|
|
||||||
namespace anbs_cp.Classes;
|
namespace anbs_cp.Classes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сериализованная модель значения класса, хранящего в себе состояния действия
|
/// Сериализованная модель значения класса, хранящего в себе состояния действия
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ActionStateSerializableValue: ISerializable
|
public sealed class ActionStateSerializableValue: ISerializable
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Значение - null?
|
/// Значение - null?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private bool IsNull { get; set; }
|
public bool IsNull { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Сериализуемое значение
|
/// Сериализуемое значение
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private string Serialized { get; set; } = string.Empty;
|
public string Serialized { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получает значение из <paramref name="value"/>
|
/// Получает значение из <paramref name="value"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="value">Значение</param>
|
/// <param name="value">Значение</param>
|
||||||
/// <typeparam name="T">Тип значения</typeparam>
|
/// <typeparam name="T">Тип значения</typeparam>
|
||||||
public void GetValue<T> (T? value)
|
internal void GetValue<T> (T? value)
|
||||||
{
|
{
|
||||||
// Значение - null?
|
// Значение - null?
|
||||||
IsNull = value == null;
|
IsNull = value is null;
|
||||||
|
|
||||||
// Если не null
|
// Если не null
|
||||||
if (value != null)
|
// - сериализую
|
||||||
{
|
Serialized = value is not null ? new SysTextSerializer().Serialize(value) : string.Empty;
|
||||||
// - значение поддерживает интерфейс IsSerialized
|
|
||||||
if (value is ISerializable serializableValue)
|
|
||||||
// -- сериализую
|
|
||||||
Serialized = serializableValue.Serialize();
|
|
||||||
else
|
|
||||||
// -- сериализую
|
|
||||||
Serialized = new SysTextSerializer().Serialize(value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
// Сериализую
|
|
||||||
Serialized = new SysTextSerializer().Serialize(value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -48,28 +39,43 @@ public class ActionStateSerializableValue: ISerializable
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">Класс</typeparam>
|
/// <typeparam name="T">Класс</typeparam>
|
||||||
/// <returns>Значение</returns>
|
/// <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
|
// Если null
|
||||||
if (IsNull)
|
if (IsNull)
|
||||||
// - то возыращаем null
|
// - то возвращаем null
|
||||||
return default;
|
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!;
|
return model;
|
||||||
|
|
||||||
// Если null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Реализация интерфейса ISerializable
|
#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>
|
public sealed class ActionState: ActionState<string>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="state">Запись состояния</param>
|
/// <param name="state">Запись состояния</param>
|
||||||
public void AddState (ActionState state)
|
public void AddState (ActionState state)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Version>2024.3.26</Version>
|
<Version>2024.3.26.1</Version>
|
||||||
<Authors>Александр Бабаев</Authors>
|
<Authors>Александр Бабаев</Authors>
|
||||||
<Product>Набор компонентов ANB Software</Product>
|
<Product>Набор компонентов ANB Software</Product>
|
||||||
<Description>Библиотека полезных методов языка C#</Description>
|
<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_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_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_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/=_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_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/=_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_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_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>
|
<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_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_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_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/@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/=_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>
|
<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;
|
namespace demo;
|
||||||
|
|
||||||
partial class ActionStateSerialize
|
sealed partial class ActionStateSerialize
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace demo;
|
namespace demo;
|
||||||
|
|
||||||
public partial class ActionStateSerialize: Form
|
public sealed partial class ActionStateSerialize: Form
|
||||||
{
|
{
|
||||||
public ActionStateSerialize ()
|
public ActionStateSerialize ()
|
||||||
{
|
{
|
||||||
@ -16,7 +16,7 @@ public partial class ActionStateSerialize: Form
|
|||||||
Name = textBox1.Text.Length > 0 ? textBox1.Text : string.Empty
|
Name = textBox1.Text.Length > 0 ? textBox1.Text : string.Empty
|
||||||
};
|
};
|
||||||
|
|
||||||
ActionState<DemoClass> state = new();
|
ActionState<DemoClass> state = new(demoClass);
|
||||||
|
|
||||||
state.AddError("ОШИБКА, ШЕФ!");
|
state.AddError("ОШИБКА, ШЕФ!");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user