BITKit/Src/Core/Wrapper/IWrapper.cs

119 lines
2.9 KiB
C#
Raw Normal View History

2024-07-17 17:06:45 +08:00
using System;
using System.Reflection;
namespace BITKit
{
public interface IWrapper
{
public object Obj { get; set; }
}
public interface IWrapper<T>:IWrapper
{
2025-01-22 16:50:44 +08:00
public Action<T, T> OnValueChanged { get; set; }
2024-07-17 17:06:45 +08:00
public T Value { get; set; }
}
public class ValueWrapper<T> : IWrapper<T>
{
2025-01-22 16:50:44 +08:00
public Action<T, T> OnValueChanged { get; set; }
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;
}
2024-07-17 17:06:45 +08:00
}
2025-01-09 17:49:38 +08:00
public class PropertyWrapper<T> : IWrapper<T>
{
private readonly PropertyInfo _field;
private readonly object _target;
2025-01-22 16:50:44 +08:00
public Action<T, T> OnValueChanged { get; set; }
2025-01-09 17:49:38 +08:00
public PropertyWrapper(PropertyInfo field, object target)
{
_field = field;
_target = target ?? throw new ArgumentNullException(nameof(target));
}
public T Value
{
get => (T)_field.GetValue(_target);
set
{
var prev = Value;
_field.SetValue(_target, value);
OnValueChanged?.Invoke(prev, value);
}
}
public object Obj
{
2025-01-22 16:50:44 +08:00
get => Value;
set => Value = (T)value;
2025-01-09 17:49:38 +08:00
}
}
2024-07-17 17:06:45 +08:00
public class FieldWrapper<T> : IWrapper<T>
{
private readonly FieldInfo _field;
private readonly object _target;
public FieldWrapper(FieldInfo field, object target)
{
_field = field;
_target = target ?? throw new ArgumentNullException(nameof(target));
}
2025-01-22 16:50:44 +08:00
public Action<T, T> OnValueChanged { get; set; }
2024-07-17 17:06:45 +08:00
public T Value
{
get => (T)_field.GetValue(_target);
2025-01-22 16:50:44 +08:00
set
{
OnValueChanged?.Invoke(Value, value);
_field.SetValue(_target, value);
}
2024-07-17 17:06:45 +08:00
}
public object Obj
{
2025-01-22 16:50:44 +08:00
get => Value;
set => Value = (T)value;
2024-07-17 17:06:45 +08:00
}
}
public class FuncWrapper<T> : IWrapper<T>
{
private readonly Func<T> _get;
private readonly Action<T> _set;
public FuncWrapper(Func<T> get, Action<T> set)
{
_get = get;
_set = set;
}
2025-01-22 16:50:44 +08:00
public Action<T, T> OnValueChanged { get; set; }
2024-07-17 17:06:45 +08:00
public T Value
{
get => _get();
set => _set(value);
}
public object Obj
{
2025-01-22 16:50:44 +08:00
get => Value;
set => Value = (T)value;
2024-07-17 17:06:45 +08:00
}
}
}