|  |  |  |  | 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(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |