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.
		
		
		
		
		
			
		
			
	
	
		
			56 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											2 years ago
										 
									 | 
							
								using System;
							 | 
						||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Game
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public class MetaDataHandler
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        private readonly Dictionary<IMetaData, List<Delegate>> _metaDataDict= new Dictionary<IMetaData, List<Delegate>>();
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        protected virtual void OnCreateBind() { }
							 | 
						||
| 
								 | 
							
								        protected void CreateBind()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            OnCreateBind();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        protected void ClearBind()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            foreach (var kvp in _metaDataDict)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var metaData = kvp.Key;
							 | 
						||
| 
								 | 
							
								                foreach (var handler in kvp.Value)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    metaData.RemoveEvent(handler);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            _metaDataDict.Clear();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        protected void ReBindData<TData>(MetaBase<TData> metaData, EventMetaData<TData> handler)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            UnbindData(metaData);
							 | 
						||
| 
								 | 
							
								            BindData(metaData, handler);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        protected void BindData<TData>(MetaBase<TData> metaData, EventMetaData<TData> handler)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            metaData.AddEvent(handler);
							 | 
						||
| 
								 | 
							
								            var metaInter = (IMetaData)metaData;
							 | 
						||
| 
								 | 
							
								            if (!_metaDataDict.ContainsKey(metaInter))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                _metaDataDict[metaInter] = new List<Delegate>();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            _metaDataDict[metaInter].Add(handler);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        protected void UnbindData<TData>(MetaBase<TData> metaData)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var metaInter = (IMetaData)metaData;
							 | 
						||
| 
								 | 
							
								            if (_metaDataDict.ContainsKey(metaInter))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                foreach (var handler in _metaDataDict[metaInter])
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    metaData.RemoveEvent(handler);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                _metaDataDict[metaInter].Clear();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            _metaDataDict.Remove(metaInter);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |