This commit is contained in:
CortexCore 2025-01-22 16:50:44 +08:00
parent 01e7e4e35e
commit 6f913eb234
2 changed files with 55 additions and 10 deletions

View File

@ -1,4 +1,5 @@
using System; using System;
using Cysharp.Threading.Tasks;
namespace BITKit namespace BITKit
{ {
@ -70,6 +71,22 @@ namespace BITKit
return Allow ? Value : other.Invoke(); return Allow ? Value : other.Invoke();
} }
public async UniTask<T> IfNotAllowAsync(Func<UniTask<T>> func)
{
return Allow ? Value : await func.Invoke();
}
public async UniTask<T> SetValueThenAllowAsync(Func<UniTask<T>> func)
{
if (Allow)
{
return value;
}
value = await func.Invoke();
allow = true;
return value;
}
public void SetValueThenAllow(T newValue) public void SetValueThenAllow(T newValue)
{ {
value = newValue; value = newValue;

View File

@ -9,19 +9,37 @@ namespace BITKit
} }
public interface IWrapper<T>:IWrapper public interface IWrapper<T>:IWrapper
{ {
public Action<T, T> OnValueChanged { get; set; }
public T Value { get; set; } public T Value { get; set; }
} }
public class ValueWrapper<T> : IWrapper<T> public class ValueWrapper<T> : IWrapper<T>
{ {
public T Value { get; set; }=default; public Action<T, T> OnValueChanged { get; set; }
public object Obj { get => Value; set => Value = (T)value; }
public T Value
{
get => _value;
set
{
var prev = _value;
_value = value;
OnValueChanged?.Invoke(prev,value);
}
}
private T _value = typeof(T) == typeof(string) ? string.Empty.As<T>() : Activator.CreateInstance<T>();
public object Obj
{
get => Value;
set => Value = (T)value;
}
} }
public class PropertyWrapper<T> : IWrapper<T> public class PropertyWrapper<T> : IWrapper<T>
{ {
private readonly PropertyInfo _field; private readonly PropertyInfo _field;
private readonly object _target; private readonly object _target;
public event Action<T, T> OnValueChanged; public Action<T, T> OnValueChanged { get; set; }
public PropertyWrapper(PropertyInfo field, object target) public PropertyWrapper(PropertyInfo field, object target)
{ {
_field = field; _field = field;
@ -40,8 +58,8 @@ namespace BITKit
public object Obj public object Obj
{ {
get => _field.GetValue(_target); get => Value;
set => _field.SetValue(_target, value); set => Value = (T)value;
} }
} }
public class FieldWrapper<T> : IWrapper<T> public class FieldWrapper<T> : IWrapper<T>
@ -53,16 +71,23 @@ namespace BITKit
_field = field; _field = field;
_target = target ?? throw new ArgumentNullException(nameof(target)); _target = target ?? throw new ArgumentNullException(nameof(target));
} }
public Action<T, T> OnValueChanged { get; set; }
public T Value public T Value
{ {
get => (T)_field.GetValue(_target); get => (T)_field.GetValue(_target);
set => _field.SetValue(_target, value); set
{
OnValueChanged?.Invoke(Value, value);
_field.SetValue(_target, value);
}
} }
public object Obj public object Obj
{ {
get => _field.GetValue(_target); get => Value;
set => _field.SetValue(_target, value); set => Value = (T)value;
} }
} }
public class FuncWrapper<T> : IWrapper<T> public class FuncWrapper<T> : IWrapper<T>
@ -74,6 +99,9 @@ namespace BITKit
_get = get; _get = get;
_set = set; _set = set;
} }
public Action<T, T> OnValueChanged { get; set; }
public T Value public T Value
{ {
get => _get(); get => _get();
@ -82,8 +110,8 @@ namespace BITKit
public object Obj public object Obj
{ {
get => _get(); get => Value;
set => _set((T)value); set => Value = (T)value;
} }
} }
} }