c# 委托 envent 工具类
来源:互联网 发布:电脑卡片制作软件 编辑:程序博客网 时间:2024/06/15 03:47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ActionDemo
{
public interface ISubscriber
{
System.Action<object[]> Handler
{
set;
}
void Unsubscribe();
}
public static class EventManager
{
static Dictionary<string, List<Subscriber>> ms_subscribers = new Dictionary<string, List<Subscriber>>();
private class Subscriber : ISubscriber
{
string m_subscribeKey;
System.Action<object[]> m_handler;
public Subscriber(string key)
{
m_subscribeKey = key;
}
~Subscriber()
{
if (string.IsNullOrEmpty(m_subscribeKey))
return;
Unsubscribe();
}
public System.Action<object[]> Handler
{
set { m_handler = value; }
}
public void Notify(params object[] args)
{
if (m_handler != null)
m_handler(args);
}
public void Unsubscribe()
{
List<Subscriber> sublist = null;
if (!ms_subscribers.TryGetValue(m_subscribeKey, out sublist))
{
return;
}
sublist.Remove(this);
if (sublist.Count == 0)
{
ms_subscribers.Remove(m_subscribeKey);
}
m_subscribeKey = null;
}
}
public static ISubscriber Subscribe(string name)
{
List<Subscriber> sublist = null;
if (!ms_subscribers.TryGetValue(name, out sublist))
{
sublist = new List<Subscriber>();
ms_subscribers.Add(name, sublist);
}
Subscriber sub = new Subscriber(name);
sublist.Add(sub);
return sub;
}
private static void Notify(string name, params object[] args)
{
List<Subscriber> sublist = null;
if (!ms_subscribers.TryGetValue(name, out sublist))
{
return;
}
Subscriber[] subs = sublist.ToArray();
foreach (var sub in subs)
{
if (!sublist.Contains(sub))
continue;
sub.Notify(args);
}
}
public abstract class Publisher
{
public abstract string Name
{
get;
}
protected void Notify(string name, params object[] args)
{
EventManager.Notify(Name + ":" + name, args);
}
}
}
}
----------------------------------------------------------------------------出版商-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ActionDemo
{
public class PlayerDataPublisher : EventManager.Publisher
{
public static string NAME = "PlayerData";
public static string EVENT_WORTH_UPDATE = "WorthUpdate";
public static string EVENT_PROPERTY_UPDATE = "PropertyUpdate";
public override string Name
{
get { return NAME; }
}
public void NotifyWorthUpdate(string data)
{
base.Notify(EVENT_WORTH_UPDATE, data);
}
public void NotifyPropertyUpdate(string data)
{
base.Notify(EVENT_PROPERTY_UPDATE, data);
}
}
}
---------------------------------------------------------------------订阅者-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ActionDemo
{
class Test
{
public Test()
{
RegisterInfoChange();
}
public void RegisterInfoChange()
{
_mInfoUpdate = EventManager.Subscribe(PlayerDataPublisher.NAME + ":" + PlayerDataPublisher.EVENT_WORTH_UPDATE);
_mInfoUpdate.Handler = delegate(object[] args)
{
string str = (string)args[0];
NotifyMe(str);
};
}
public void NotifyMe(string str)
{
Console.WriteLine("我接到了通知。。。");
Console.WriteLine(str);
}
public ISubscriber _mInfoUpdate;
}
}
---------------------------------------------------------------main函数-------------------------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
PlayerDataPublisher p = new PlayerDataPublisher();
Test t = new Test();
p.NotifyWorthUpdate("明天不上班");
}
}
- c# 委托 envent 工具类
- C#异步调用委托工具类
- C# 中的委托类
- mysql envent
- C#委托-委托概述
- C#委托
- C#委托
- C#委托
- c#委托
- C# 委托
- C#委托
- C# 委托
- c#委托
- C#委托
- c#委托
- C#委托
- C# - 委托
- C#委托
- 唯品会们的困境
- 指令重排序优化分析和volatile对编译优化的作用
- 题目1468:Sharing
- instrumentation中SyncBaseInstrumentation学习笔记(7)
- unity3d游戏物体跟着鼠标方向移动
- c# 委托 envent 工具类
- 2013 duilib入门简明教程 -- 前言(1)
- Alberl 2013 duilib入门简明教程 -- VS环境配置(2)
- python 使用sqlite3
- 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)
- java实现一个简单的HTTP服务器,带打开网页和计算功能
- Linux下动态挂载硬盘,其实就这么简单
- 2013 duilib入门简明教程 -- 响应按钮事件(4)
- 看书小记4(《C专家编程》)