|  |  | using System;
 | 
						
						
						
							|  |  | using System.Collections.Generic;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | namespace Game
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// 数据绑定,改变数据时回调,只支持基本数据类型、list
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     public interface IMetaData
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         void AddEvent(Delegate callback);
 | 
						
						
						
							|  |  |         void RemoveEvent(Delegate callback);
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     public delegate void EventMetaData<ValueType>(ValueType valuePre, ValueType valueNow);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     public class MetaBase<T> : IMetaData
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         protected T ValueReal;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public T Value
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             get => ValueReal;
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (ValueReal != null && ValueReal.Equals(value)) return;
 | 
						
						
						
							|  |  |                 OnValueChange(ValueReal, value);
 | 
						
						
						
							|  |  |                 ValueReal = value;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         private Delegate _handler;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void AddEvent(Delegate callback)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_handler == null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _handler = callback;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 _handler = (EventMetaData<T>)_handler + (EventMetaData<T>)callback;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //绑定的时候执行一次
 | 
						
						
						
							|  |  |             ((EventMetaData<T>)callback)(ValueReal, ValueReal);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void RemoveEvent(Delegate callback)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _handler = (EventMetaData<T>)_handler - (EventMetaData<T>)callback;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         private void OnValueChange(T valuePre, T valueNow)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_handler == null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             foreach (var callback in _handler.GetInvocationList())
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 ((EventMetaData<T>)callback)(valuePre, valueNow);
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         protected void OnValueChange()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             OnValueChange(ValueReal, ValueReal);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     public class MetaData<T> : MetaBase<T>
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     public class MetaList<T> : MetaBase<List<T>>
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         public T this[int key]
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             set => Value[key] = value;
 | 
						
						
						
							|  |  |             get => Value[key];
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void Add(T data)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.Add(data);
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void AddRange(IEnumerable<T> collection)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.AddRange(collection);
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void Clear()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.Clear();
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void Remove(T data)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.Remove(data);
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     public class MetaDictionary<TKey, TValue> : MetaBase<Dictionary<TKey, TValue>>
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         public MetaDictionary()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal = new Dictionary<TKey, TValue>();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public TValue this[TKey key]
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             set
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 var isChange = !ValueReal.ContainsKey(key);
 | 
						
						
						
							|  |  |                 ValueReal[key] = value;
 | 
						
						
						
							|  |  |                 if (isChange)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     OnValueChange();
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             get => ValueReal[key];
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public int Count => ValueReal.Count;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void Clear()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.Clear();
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public void Remove(TKey data)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             ValueReal.Remove(data);
 | 
						
						
						
							|  |  |             OnValueChange();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public bool ContainsKey(TKey data)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return ValueReal.ContainsKey(data);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public Dictionary<TKey, TValue>.Enumerator GetEnumerator()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return ValueReal.GetEnumerator();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | } |