现在的位置: 首页 > 综合 > 正文

如何:使用字典存储事件实例(C# 编程指南)

2013年08月15日 ⁄ 综合 ⁄ 共 2091字 ⁄ 字号 评论关闭

 

C# 编程指南
如何:使用字典存储事件实例(C# 编程指南)
 
accessor-declarations 的一种用法是公开大量的事件但不为每个事件分配字段,而是使用字典来存储这些事件实例。这只有在具有非常多的事件、但您预计大部分事件都不会实现时才有用。
示例
C#
public delegate void EventHandler1(int i);
public delegate void EventHandler2(string s);
 
publicclass PropertyEventsSample
{
    private System.Collections.Generic.Dictionary<string, System.Delegate> eventTable;
 
    public PropertyEventsSample()
    {
        eventTable = new System.Collections.Generic.Dictionary<string, System.Delegate>();
        eventTable.Add("Event1", null);
        eventTable.Add("Event2", null);
    }
 
    public event EventHandler1 Event1
    {
        add
        {
            eventTable["Event1"] = (EventHandler1)eventTable["Event1"] + value;
        }
        remove
        {
            eventTable["Event1"] = (EventHandler1)eventTable["Event1"] - value;
        }
    }
 
    public event EventHandler2 Event2
    {
        add
        {
            eventTable["Event2"] = (EventHandler2)eventTable["Event2"] + value;
        }
        remove
        {
            eventTable["Event2"] = (EventHandler2)eventTable["Event2"] - value;
        }
    }
 
    internal void RaiseEvent1(int i)
    {
        EventHandler1 handler1;
        if (null != (handler1 = (EventHandler1)eventTable["Event1"]))
        {
            handler1(i);
        }
    }
 
    internal void RaiseEvent2(string s)
    {
        EventHandler2 handler2;
        if (null != (handler2 = (EventHandler2)eventTable["Event2"]))
        {
            handler2(s);
        }
    }
}
 
publicclass TestClass
{
    publicstaticvoid Delegate1Method(int i)
    {
        System.Console.WriteLine(i);
    }
 
    publicstaticvoid Delegate2Method(string s)
    {
        System.Console.WriteLine(s);
    }
 
    staticvoid Main()
    {
        PropertyEventsSample p = new PropertyEventsSample();
 
        p.Event1 += new EventHandler1(TestClass.Delegate1Method);
        p.Event1 += new EventHandler1(TestClass.Delegate1Method);
        p.Event1 -= new EventHandler1(TestClass.Delegate1Method);
        p.RaiseEvent1(2);
 
        p.Event2 += new EventHandler2(TestClass.Delegate2Method);
        p.Event2 += new EventHandler2(TestClass.Delegate2Method);
        p.Event2 -= new EventHandler2(TestClass.Delegate2Method);
        p.RaiseEvent2("TestString");
    }
}
输出
2
TestString
 
 (来源:msdn )
 

抱歉!评论已关闭.