gpt4 book ai didi

c# - 处理多类事件的最佳方式?

转载 作者:行者123 更新时间:2023-11-30 16:27:44 24 4
gpt4 key购买 nike

所以我有一个类基本上是另一个类的 20 多个副本的管理者。处理从它们中的每一个触发的相同事件的最佳方法是什么?这是取消注册事件的最佳方式吗?或者我应该以某种方式使用单个 EventHandler 吗?

我整理了一个简单的示例,它基本上完成了我在实际项目中所做的事情。

class Manager
{
List<Child> children = new List<Child>();

public Manager()
{
for (int i = 0; i < 10; i++)
{
Childchild = new Child();
child.Done += child_Done;
items.Add(child);
child.DoStuff();
}
}

public void RemoveAll()
{
foreach (Child child in items)
{
child.Done -= child_Done;
}
items.Clear();
}

void child_Done(string sometext)
{
Console.WriteLine("child done: " + sometext);
}
}

class Child
{
public delegate void _Done(string sometext);
public event _Done Done;

public Child()
{

}

public void DoStuff()
{
if (Done != null) { Done("finally!"); }
}
}

最佳答案

注销应该没问题——只要目标实例和方法匹配就可以。但是,我会强烈建议您使用更常规的事件模式,使用 sender - 然后您就会知道哪个 child 在说话。例如:

public class MessageEventArgs : EventArgs {
public MessageEventArgs(string message) {
this.message = message;
}
private readonly string message;
public string Message { get { return message; } }
}

和一个:

public event EventHandler<MessageEventArgs> Done;
protected virtual void OnDone(string message) {
var handler = Done;
if(handler != null) handler(this, new MessageEventArgs(message));
}

关于c# - 处理多类事件的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com