using System; using System.Collections.Generic; using UnityEngine; namespace TNodeCore.Runtime{ [Serializable] public class DataWrapper:ScriptableObject where TWrapper:DataWrapper,new(){ [SerializeReference] public TData data; protected static readonly Dictionary Cache = new (); public static TWrapper Get(TData data){ if (data.GetType().IsGenericType){ return CreateInstance(); } if(Cache.ContainsKey(data)){ return Cache[data]==null?CreateInstance():Cache[data]; } var wrapper = CreateInstance(); wrapper.data = data; Cache.Add(data,wrapper); return wrapper; } public event Action> OnValueChanged; public void SetValue(string path, object value){ var fieldInfo = data.GetType().GetField(path); fieldInfo.SetValue(data,value); OnValueChanged?.Invoke(this); } public void ForceNotify(){ OnValueChanged?.Invoke(this); } public object GetValue(string path){ var fieldInfo = data.GetType().GetField(path); return fieldInfo.GetValue(data); } public virtual TData GetData(){ return data; } public static implicit operator TData(DataWrapper wrapper){ if (wrapper == null) return default(TData); return wrapper.GetData(); } /// /// Use this to get the wrapped data directly. /// /// /// public static implicit operator DataWrapper(TData unWrapper){ if (unWrapper == null) return null; return Get(unWrapper); } } }