add PropertyObject & PropertyValue, move to Pilz, make everything .net 8 only

This commit is contained in:
Pilzinsel64
2025-04-02 07:25:41 +02:00
parent 91e1987d75
commit 9a17cd4e9e
27 changed files with 136 additions and 30 deletions

149
Pilz/Data/DataManager.cs Normal file
View File

@@ -0,0 +1,149 @@
using System.Diagnostics.CodeAnalysis;
namespace Pilz.Data;
public abstract class DataManager : IDataManager
{
protected abstract void UpdateEntity<T>(T obj) where T : class, IDataObject;
protected abstract IQueryable<T> GetEntitySet<T>() where T : class, IDataObject;
protected abstract T? FindEntity<T>(int id) where T : class, IDataObject;
protected abstract void RemoveEntity<T>(T obj) where T : class, IDataObject;
protected abstract void SaveChanges();
public virtual IQueryable<T> Get<T>() where T : class, IDataObject
{
return GetEntitySet<T>();
}
public virtual T FindOrNew<T>(int? id) where T : class, IDataObject
{
if (Find<T>(id) is not T obj)
obj = Activator.CreateInstance<T>();
return obj;
}
public virtual T FindOrNew<T>(int id) where T : class, IDataObject
{
if (Find<T>(id) is not T obj)
obj = Activator.CreateInstance<T>();
return obj;
}
public virtual T? FindOrNull<T>(int? id) where T : class, IDataObject
{
if (id == null || id == 0)
return default;
return Find<T>(id);
}
public virtual T? FindOrNull<T>(int id) where T : class, IDataObject
{
if (id == 0)
return default;
return Find<T>(id);
}
public virtual T? Find<T>(int? id) where T : class, IDataObject
{
if (id == null)
return default;
return Find<T>(id.Value);
}
public virtual T? Find<T>(int id) where T : class, IDataObject
{
return FindEntity<T>(id);
}
public virtual bool FindOrNew<T>(int? id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject
{
if (id == null || id == 0)
{
obj = Activator.CreateInstance<T>();
return obj != null;
}
return Find(id.Value, out obj);
}
public virtual bool FindOrNew<T>(int id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject
{
if (id == 0)
{
obj = Activator.CreateInstance<T>();
return obj != null;
}
return Find(id, out obj);
}
public virtual bool FindOrNull<T>(int? id, out T? obj) where T : class, IDataObject
{
if (id == null || id == 0)
{
obj = default;
return true;
}
return Find(id.Value, out obj);
}
public virtual bool FindOrNull<T>(int id, out T? obj) where T : class, IDataObject
{
if (id == 0)
{
obj = default;
return true;
}
return Find(id, out obj);
}
public virtual bool Find<T>(int id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject
{
if (FindEntity<T>(id) is not T t)
{
obj = default;
return false;
}
obj = t;
return true;
}
public virtual void Delete<T>(int id) where T : class, IDataObject
{
Delete<T>(id, false);
}
public virtual void Delete<T>(int id, bool save) where T : class, IDataObject
{
if (Find(id, out T? obj))
Delete(obj, save);
}
public virtual void Delete<T>(T? obj) where T : class, IDataObject
{
Delete(obj, false);
}
public virtual void Delete<T>(T? obj, bool save) where T : class, IDataObject
{
if (obj != null)
{
RemoveEntity(obj);
if (save) Save();
}
}
public virtual void Save<T>(T obj) where T : class, IDataObject
{
Save(obj, false);
}
public virtual void Save<T>(T obj, bool save) where T : class, IDataObject
{
UpdateEntity(obj);
if (save) Save();
}
public virtual void Save()
{
SaveChanges();
}
}

View File

@@ -0,0 +1,8 @@
namespace Pilz.Data;
public class DataManagerEventArgs(IDataManager manager) : EventArgs
{
public IDataManager Manager { get; } = manager;
}
public delegate void DataManagerEventHandler(object sender, DataManagerEventArgs e);

26
Pilz/Data/IDataManager.cs Normal file
View File

@@ -0,0 +1,26 @@
using System.Diagnostics.CodeAnalysis;
namespace Pilz.Data;
public interface IDataManager
{
void Delete<T>(int id) where T : class, IDataObject;
void Delete<T>(int id, bool save) where T : class, IDataObject;
void Delete<T>(T? obj) where T : class, IDataObject;
void Delete<T>(T? obj, bool save) where T : class, IDataObject;
T? Find<T>(int id) where T : class, IDataObject;
bool Find<T>(int id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject;
T? Find<T>(int? id) where T : class, IDataObject;
T FindOrNew<T>(int id) where T : class, IDataObject;
bool FindOrNew<T>(int id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject;
T FindOrNew<T>(int? id) where T : class, IDataObject;
bool FindOrNew<T>(int? id, [NotNullWhen(true)] out T? obj) where T : class, IDataObject;
T? FindOrNull<T>(int id) where T : class, IDataObject;
bool FindOrNull<T>(int id, out T? obj) where T : class, IDataObject;
T? FindOrNull<T>(int? id) where T : class, IDataObject;
bool FindOrNull<T>(int? id, out T? obj) where T : class, IDataObject;
IQueryable<T> Get<T>() where T : class, IDataObject;
void Save();
void Save<T>(T obj) where T : class, IDataObject;
void Save<T>(T obj, bool save) where T : class, IDataObject;
}

6
Pilz/Data/IDataObject.cs Normal file
View File

@@ -0,0 +1,6 @@
namespace Pilz.Data;
public interface IDataObject
{
public int Id { get; }
}

View File

@@ -0,0 +1,47 @@
namespace Pilz.Data;
#pragma warning disable CA2231
[Serializable]
public struct PropertyObject<T>(T value) where T : class
{
private readonly bool hasValue = true; // Do not rename (binary serialization)
internal T? value = value; // Do not rename (binary serialization) or make readonly (can be mutated in ToString, etc.)
public static PropertyObject<T> Empty => default;
public readonly bool HasValue
{
get => hasValue;
}
public readonly T? Value
{
get
{
if (!hasValue)
throw new InvalidOperationException("No value");
return value;
}
}
public readonly T? GetValueOrDefault() => value;
public readonly T? GetValueOrDefault(T defaultValue) =>
hasValue ? value : defaultValue;
public override readonly bool Equals(object? other)
{
if (!hasValue || value is null) return other == null;
if (other == null) return false;
return value.Equals(other);
}
public override readonly int GetHashCode() => hasValue && value is not null ? value.GetHashCode() : 0;
public override readonly string? ToString() => hasValue && value is not null ? value.ToString() : string.Empty;
public static implicit operator PropertyObject<T>(T value) => new(value);
public static explicit operator T?(PropertyObject<T> value) => value.Value;
}

View File

@@ -0,0 +1,54 @@
using Newtonsoft.Json;
namespace Pilz.Data;
#pragma warning disable CA2231
[Serializable]
public struct PropertyValue<T>(T value) where T : struct
{
[JsonProperty(PropertyName = "HasValue")]
private readonly bool hasValue = true; // Do not rename (binary serialization)
[JsonProperty(PropertyName = "Value")]
internal T value = value; // Do not rename (binary serialization) or make readonly (can be mutated in ToString, etc.)
[JsonIgnore]
public static PropertyValue<T> Empty => default;
[JsonIgnore]
public readonly bool HasValue
{
get => hasValue;
}
[JsonIgnore]
public readonly T Value
{
get
{
if (!hasValue)
throw new InvalidOperationException("No value");
return value;
}
}
public readonly T GetValueOrDefault() => value;
public readonly T GetValueOrDefault(T defaultValue) =>
hasValue ? value : defaultValue;
public override readonly bool Equals(object? other)
{
if (!hasValue) return other == null;
if (other == null) return false;
return value.Equals(other);
}
public override readonly int GetHashCode() => hasValue ? value.GetHashCode() : 0;
public override readonly string? ToString() => hasValue ? value.ToString() : string.Empty;
public static implicit operator PropertyValue<T>(T value) => new(value);
public static explicit operator T(PropertyValue<T> value) => value.Value;
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>annotations</Nullable>