This commit is contained in:
Alexander
2023-11-25 17:11:04 +03:00
parent 77c602cd9c
commit 73e6e4d3b1
13 changed files with 328 additions and 23 deletions

View File

@@ -0,0 +1,25 @@
using System.Text.Json;
namespace anbs_cp.Classes;
/// <summary>
/// Класс для сериализации моделей
/// </summary>
public static class Serializer
{
/// <summary>
/// Сериализация данных <paramref name="data"/> в строку.
/// </summary>
/// <typeparam name="T">Тип данных</typeparam>
/// <param name="data">Данные</param>
/// <returns>Сериализованные данные</returns>
public static string Serialize<T>(T data) => JsonSerializer.Serialize(data);
/// <summary>
/// Десериализация данных из json-строки <paramref name="json"/>
/// </summary>
/// <typeparam name="T">Ожидаемый тип данных</typeparam>
/// <param name="json">Сериализованные данные</param>
/// <returns>Данные</returns>
public static T? Deserialize<T>(string json) => JsonSerializer.Deserialize<T>(json);
}

View File

@@ -1,7 +1,5 @@
using System.Globalization;
using Newtonsoft.Json;
namespace anbs_cp.Classes;
/// <summary>
@@ -73,7 +71,7 @@ public static class TypeConverter
/// <typeparam name="T">Тип</typeparam>
/// <param name="value">Значение типа</param>
/// <returns>Значение в <see cref="string"/></returns>
public static string TypeToStr<T> (T value) => JsonConvert.SerializeObject(value);
public static string TypeToStr<T> (T value) => Serializer.Serialize(value);
#endregion
@@ -159,7 +157,7 @@ public static class TypeConverter
/// <param name="defaultValue">Значение по умолчанию</param>
/// <returns>Значение в <see cref="T"/></returns>
public static T StrToType<T>(string value, T defaultValue) =>
JsonConvert.DeserializeObject<T>(value) ?? defaultValue;
Serializer.Deserialize<T>(value) ?? defaultValue;
#endregion
}

View File

@@ -0,0 +1,16 @@
namespace anbs_cp.Extensions;
/// <summary>
/// Расширение типа "правда/ложь"
/// </summary>
public static class BooleanExtensions
{
/// <summary>
/// Вывод в строку <paramref name="ifTrue"/>, если выражение <paramref name="b"/> правдиво и <paramref name="ifFalse"/> в противном случае.
/// </summary>
/// <param name="b">Выражение типа правда/ложь</param>
/// <param name="ifTrue">Строка для правдивого выражения</param>
/// <param name="ifFalse">Строка для лживого выражения</param>
/// <returns>Вывод строки</returns>
public static string ExportToString (this bool b, string ifTrue, string ifFalse) => b ? ifTrue : ifFalse;
}

View File

@@ -0,0 +1,14 @@
namespace anbs_cp.Extensions;
/// <summary>
/// Расширение строк
/// </summary>
public static class StringExtensions
{
/// <summary>
/// Проверяет строку на пустоту
/// </summary>
/// <param name="s">Строка</param>
/// <returns>Строка пусть (null) или содержит только пробелы</returns>
public static bool IsNullOrWhiteSpace(this string? s) => s == null || s.Trim().Length == 0;
}

View File

@@ -0,0 +1,19 @@
namespace anbs_cp.Interfaces;
/// <summary>
/// Интерфейс для сериализации объектов
/// </summary>
public interface ISerializable
{
/// <summary>
/// Сериализовать элемент в формат json
/// </summary>
/// <returns>Строка в формате json</returns>
string Serialize();
/// <summary>
/// Восстановить элемент из формата json
/// </summary>
/// <param name="json">Строка в формате json</param>
void Deserialize(string json);
}

View File

@@ -1,11 +1,14 @@
namespace anbs_cp.Structs;
using anbs_cp.Classes;
using anbs_cp.Interfaces;
namespace anbs_cp.Structs;
/// <summary>
/// Двумерный размер
/// </summary>
/// <param name="width">Длина</param>
/// <param name="height">Высота</param>
public struct TwoDimSize (int width = 0, int height = 0)
public struct TwoDimSize (int width = 0, int height = 0): ISerializable
{
#region Приватные поля
/// <summary>
@@ -14,7 +17,7 @@ public struct TwoDimSize (int width = 0, int height = 0)
private int _pWidth = width;
/// <summary>
/// Высота (приватное)
/// Ширина (приватное)
/// </summary>
private int _pHeight = height;
#endregion
@@ -30,7 +33,7 @@ public struct TwoDimSize (int width = 0, int height = 0)
}
/// <summary>
/// Высота
/// Ширина
/// </summary>
public int Height
{
@@ -38,4 +41,70 @@ public struct TwoDimSize (int width = 0, int height = 0)
set => _pHeight = value < 0 ? 0 : value;
}
#endregion
#region Методы
/// <summary>
/// Конвертация в строку
/// </summary>
/// <param name="delimiter">Делитель размера</param>
/// <returns>Строка</returns>
public readonly string ToString (char delimiter = ':') => $"{_pWidth}{delimiter}{_pHeight}";
/// <summary>
/// Получение размера из строки
/// </summary>
/// <param name="s">Строка</param>
/// <param name="delimiter">Разделитель размеров</param>
/// <returns>Модель размеров</returns>
/// <exception cref="ArgumentOutOfRangeException">Если в строке <paramref name="s"/> не содержится символа
/// <paramref name="delimiter"/> или таких разделителей слишком много</exception>
public static TwoDimSize Parse (string s, char delimiter = ':')
{
// Разделяю значения
string[] splitSizes = s.Split(delimiter);
// Проверяю, что массив имеет ровно два элемента
if (splitSizes.Length != 2)
throw new ArgumentOutOfRangeException(delimiter.ToString(),
$"Похоже, что в строке {s} не содержится символа {delimiter} или таких разделителей слишком много!");
// Пытаюсь получить длину
if (!int.TryParse(splitSizes[0], out int width))
width = 0;
// Пытаюсь получить ширину
if (!int.TryParse(splitSizes[1], out int height))
height = 0;
// Вывожу значение
return new(width, height);
}
#endregion
#region Реализация интерфейса ISerializable
/// <summary>
/// Сериализовать элемент в формат json
/// </summary>
/// <returns>Строка в формате json</returns>
public readonly string Serialize () => Serializer.Serialize(ToString());
/// <summary>
/// Восстановить элемент из формата json
/// </summary>
/// <param name="json">Строка в формате json</param>
public void Deserialize (string json)
{
// Десериализую строку
string deserialized = Serializer.Deserialize<string>(json) ?? "0:0";
// Перевожу строку в двумерный размер
TwoDimSize result = Parse(deserialized);
// Присваиваю длину
_pWidth = result.Width;
// Присваиваю ширину
_pHeight = result.Height;
}
#endregion
}

View File

@@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Version>2023.1123.0</Version>
<Version>2023.1125.0</Version>
<Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software</Product>
<Description>Библиотека полезных методов языка C#</Description>
@@ -41,7 +41,6 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>