2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
3.7 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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