using System;
using System.Collections.Generic;
namespace Game
{
///
/// 数据绑定,改变数据时回调,只支持基本数据类型、list
///
public interface IMetaData
{
void AddEvent(Delegate callback);
void RemoveEvent(Delegate callback);
}
public delegate void EventMetaData(ValueType valuePre, ValueType valueNow);
public class MetaBase : 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)_handler + (EventMetaData)callback;
}
//绑定的时候执行一次
((EventMetaData)callback)(ValueReal, ValueReal);
}
public void RemoveEvent(Delegate callback)
{
_handler = (EventMetaData)_handler - (EventMetaData)callback;
}
private void OnValueChange(T valuePre, T valueNow)
{
if (_handler == null)
{
return;
}
foreach (var callback in _handler.GetInvocationList())
{
((EventMetaData)callback)(valuePre, valueNow);
}
}
protected void OnValueChange()
{
OnValueChange(ValueReal, ValueReal);
}
}
public class MetaData : MetaBase
{
}
public class MetaList : MetaBase>
{
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 collection)
{
ValueReal.AddRange(collection);
OnValueChange();
}
public void Clear()
{
ValueReal.Clear();
OnValueChange();
}
public void Remove(T data)
{
ValueReal.Remove(data);
OnValueChange();
}
}
public class MetaDictionary : MetaBase>
{
public MetaDictionary()
{
ValueReal = new Dictionary();
}
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.Enumerator GetEnumerator()
{
return ValueReal.GetEnumerator();
}
}
}