com.alicizax.unity.editor.e.../Editor/Toolbar/SerializableValues/Variable.cs
2025-08-01 19:32:29 +08:00

69 lines
2.2 KiB
C#

using System;
using System.Reflection;
namespace Paps.UnityToolbarExtenderUIToolkit
{
internal abstract class Variable
{
private string _lastValueSerialized;
private string LastValueSerialized
{
get
{
if (_lastValueSerialized == null)
_lastValueSerialized = Serialize(Get());
return _lastValueSerialized;
}
set => _lastValueSerialized = value;
}
private IValueSerializer _valueSerializer;
private MethodInfo _serializeValueMethod, _deserializeValueMethod;
public MainToolbarElement Element { get; }
public Type ValueType { get; }
public SerializeAttribute Attribute { get; }
public Variable(MainToolbarElement element, Type valueType, object initialValue, IValueSerializer valueSerializer, SerializeAttribute attribute)
{
Element = element;
ValueType = valueType;
_valueSerializer = valueSerializer;
Attribute = attribute;
_serializeValueMethod = _valueSerializer.GetType().GetMethod("Serialize", BindingFlags.Instance | BindingFlags.Public);
_deserializeValueMethod = _valueSerializer.GetType().GetMethod("Deserialize", BindingFlags.Instance | BindingFlags.Public);
}
public abstract object Get();
public abstract void Set(object value);
public bool DidChange()
{
var currentValue = Get();
var currentValueSerialized = Serialize(currentValue);
return currentValueSerialized != LastValueSerialized;
}
private string Serialize(object value)
{
var genericMethod = _serializeValueMethod.MakeGenericMethod(ValueType);
return (string)genericMethod.Invoke(_valueSerializer, new object[] { Get() });
}
private object Deserialize(string serialized)
{
var genericMethod = _deserializeValueMethod.MakeGenericMethod(ValueType);
return genericMethod.Invoke(_valueSerializer, new object[] { serialized });
}
public void UpdateValue()
{
LastValueSerialized = Serialize(Get());
}
}
}