[计算机] 一个简单的事件系统

查看:708 |回复:2 | 2021-7-29 08:49:33

您需要 登录 才可以下载或查看,没有账号?注册

x

/*****************************************************
*        文件:        EventSystems.cs
*        作者:        李秀东
*        邮箱:        409500452@qq.com
*        日期:        #CreateTime#
*        功能:        Nothing
*****************************************************/
using System;
using System.Collections.Generic;

public delegate void CallBack();
public delegate void CallBack<T>(T arg);
public delegate void CallBack<T, X>(T arg1, X arg2);
public delegate void CallBack<T, X, Y>(T arg1, X arg2, Y arg3);
public delegate void CallBack<T, X, Y, Z>(T arg1, X arg2, Y arg3, Z arg4);
public delegate void CallBack<T, X, Y, Z, W>(T arg1, X arg2, Y arg3, Z arg4, W arg5);

public class EventSystems
{
    private static Dictionary<Enum, Delegate> m_EventTable = new Dictionary<Enum, Delegate>();
    private static void OnListenerAdding(Enum _enum, Delegate callBack)
    {
        if (!m_EventTable.ContainsKey(_enum))
        {
            m_EventTable.Add(_enum, null);
        }
        Delegate d = m_EventTable[_enum];
        if (d != null && d.GetType() != callBack.GetType())
        {
            throw new Exception(string.Format("尝试为事件{0}添加不同类型的委托,当前事件所对应的委托是{1},要添加的委托类型为{2}", _enum, d.GetType(), callBack.GetType()));
        }
    }
    private static void OnListenerRemoving(Enum _enum, Delegate callBack)
    {
        if (m_EventTable.ContainsKey(_enum))
        {
            Delegate d = m_EventTable[_enum];
            if (d == null)
            {
                throw new Exception(string.Format("移除监听错误:事件{0}没有对应的委托", _enum));
            }
            else if (d.GetType() != callBack.GetType())
            {
                throw new Exception(string.Format("移除监听错误:尝试为事件{0}移除不同类型的委托,当前委托类型为{1},要移除的委托类型为{2}", _enum, d.GetType(), callBack.GetType()));
            }
        }
        else
        {
            throw new Exception(string.Format("移除监听错误:没有事件码{0}", _enum));
        }
    }
    private static void OnListenerRemoved(Enum _enum)
    {
        if (m_EventTable[_enum] == null)
        {
            m_EventTable.Remove(_enum);
        }
    }
    public static void AddListener(Enum _enum, CallBack callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack)m_EventTable[_enum] + callBack;
    }
    public static void AddListener<T>(Enum _enum, CallBack<T> callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T>)m_EventTable[_enum] + callBack;
    }
    public static void AddListener<T, X>(Enum _enum, CallBack<T, X> callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X>)m_EventTable[_enum] + callBack;
    }
    public static void AddListener<T, X, Y>(Enum _enum, CallBack<T, X, Y> callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y>)m_EventTable[_enum] + callBack;
    }
    public static void AddListener<T, X, Y, Z>(Enum _enum, CallBack<T, X, Y, Z> callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y, Z>)m_EventTable[_enum] + callBack;
    }
    public static void AddListener<T, X, Y, Z, W>(Enum _enum, CallBack<T, X, Y, Z, W> callBack)
    {
        OnListenerAdding(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y, Z, W>)m_EventTable[_enum] + callBack;
    }


    public static void RemoveListener(Enum _enum, CallBack callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }
    public static void RemoveListener<T>(Enum _enum, CallBack<T> callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T>)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }
    public static void RemoveListener<T, X>(Enum _enum, CallBack<T, X> callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X>)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }
    public static void RemoveListener<T, X, Y>(Enum _enum, CallBack<T, X, Y> callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y>)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }
    public static void RemoveListener<T, X, Y, Z>(Enum _enum, CallBack<T, X, Y, Z> callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y, Z>)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }
    public static void RemoveListener<T, X, Y, Z, W>(Enum _enum, CallBack<T, X, Y, Z, W> callBack)
    {
        OnListenerRemoving(_enum, callBack);
        m_EventTable[_enum] = (CallBack<T, X, Y, Z, W>)m_EventTable[_enum] - callBack;
        OnListenerRemoved(_enum);
    }


    public static void Broadcast(Enum _enum)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack callBack = d as CallBack;
            if (callBack != null)
            {
                callBack();
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
    public static void Broadcast<T>(Enum _enum, T arg)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack<T> callBack = d as CallBack<T>;
            if (callBack != null)
            {
                callBack(arg);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
    public static void Broadcast<T, X>(Enum _enum, T arg1, X arg2)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack<T, X> callBack = d as CallBack<T, X>;
            if (callBack != null)
            {
                callBack(arg1, arg2);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
    public static void Broadcast<T, X, Y>(Enum _enum, T arg1, X arg2, Y arg3)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack<T, X, Y> callBack = d as CallBack<T, X, Y>;
            if (callBack != null)
            {
                callBack(arg1, arg2, arg3);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
    public static void Broadcast<T, X, Y, Z>(Enum _enum, T arg1, X arg2, Y arg3, Z arg4)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack<T, X, Y, Z> callBack = d as CallBack<T, X, Y, Z>;
            if (callBack != null)
            {
                callBack(arg1, arg2, arg3, arg4);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
    public static void Broadcast<T, X, Y, Z, W>(Enum _enum, T arg1, X arg2, Y arg3, Z arg4, W arg5)
    {
        Delegate d;
        if (m_EventTable.TryGetValue(_enum, out d))
        {
            CallBack<T, X, Y, Z, W> callBack = d as CallBack<T, X, Y, Z, W>;
            if (callBack != null)
            {
                callBack(arg1, arg2, arg3, arg4, arg5);
            }
            else
            {
                throw new Exception(string.Format("广播事件错误:事件{0}对应委托具有不同的类型", _enum));
            }
        }
    }
}
2021-7-29 08:49:33  
 赞 赞 1

使用道具 登录

2个回答,把该问题分享到群,邀请大神一起回答。
2#
是我看不懂的代码。。
回复 收起回复
2021-7-29 17:07:54   回复
 赞 赞 1

使用道具 登录

3#
回复 收起回复
2023-3-1 12:09:40   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

程序逻辑文章算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表