69 lines
2.2 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|