如何创建一个事件字典?

4

我希望拥有一个事件字典,目前我已经有:

private Dictionary<T, event Action> dictionaryOfEvents;

能否做到这样的事情呢?

1
事件字典和什么? - Rezo Megrelidze
你想要存储的是方法还是对它们的调用? - TaW
请说明为什么您认为需要一个事件集合,这将使我们能够帮助您解决问题,而不是回答技术细节。 - Emond
@ErnodeWeerd 可能想要取消订阅事件。我会使用委托列表来实现。不知道他为什么需要字典。 - Rezo Megrelidze
@rezomegreldize - 如果这样的话,最好在所有类型上实现IDisposable并在dispose方法中取消注册。 然后,集合可以简单地是IList<IDisposable>。 但这只是猜测,目前还不是问题的答案。 - Emond
@ErnodeWeerd T 是一个枚举类型,所以我想能够为枚举中的每个值调用一组函数。 - Ian Hern
3个回答

7

虽然你不能拥有事件的字典,但你可以拥有委托的字典。

private Dictionary<int, YourDelegate> delegates = new Dictionary<int, YourDelegate>();

这里的YourDelegate可以是任何委托类型。


我会这样做,但是我会使用List<YourDelegate>作为字典的值部分,以便我可以在一个键上拥有多个YourDelegate。 - Ian Hern
4
不需要使用 List<YourDelegate>,只需要使用 YourDelegate 就可以了。委托可以组合 - Sriram Sakthivel
虽然委托可以被组合/添加,但一旦它们被组合,它们就会一起被调用;这可能正是所期望的,但也可能不是。如果希望自由访问它们,则可能需要使用List或甚至第二个内部Dictionary才是正确的解决方案。 - TaW

4

Event不是类型,但Action是。 因此,例如,您可以编写:

private void button1_Click(object sender, EventArgs e)
{
  // declaration
  Dictionary<string, Action> dictionaryOfEvents = new Dictionary<string, Action>();

   // test data
  dictionaryOfEvents.Add("Test1", delegate() { testMe1(); });
  dictionaryOfEvents.Add("Test2", delegate() { testMe2(); });
  dictionaryOfEvents.Add("Test3", delegate() { button2_Click(button2, null); });

  // usage 1
  foreach(string a in dictionaryOfEvents.Keys )
    {  Console.Write("Calling "  + a  +  ":"); dictionaryOfEvents[a]();}

  // usage 2
  foreach(Action a in dictionaryOfEvents.Values) a();

  // usage 3
  dictionaryOfEvents["test2"]();

}

void testMe1() { Console.WriteLine("One for the Money"); }        
void testMe2() { Console.WriteLine("One More for the Road"); }

1

你不能直接定义一个事件类型的字典,但是你可以在类内部定义该事件。

private Dictionary<string, MyEventManager> dictionaryOfEvents;

dictionaryOfEvents["key1"].CallMyEvent();

MyEventManager类的示例实现:

public class MyEventManager {

   public event Action MyEvent;
   public void CallMyEvent => MyEvent.Invoke()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接