是否可以同时为多个代理分配相同的方法?
public class Hoge
{
public event Action EventA;
public event Action EventB;
public event Action EventC;
public Hoge()
{
EventA += () => FugaMethod();
EventB += () => FugaMethod();
EventC += () => FugaMethod();
}
private void FugaMethod()
{
Console.WriteLine("Hello.");
}
}
我想简化FugaMethod()的分配。
答案 0 :(得分:2)
因为事件不能作为参数......不幸的是......没有
如果我们谈论的是大量的事件,那么反思将是要走的路......但我并没有真正称之为"简化"
编辑:
澄清:
您可以作为参数传递的内容:
附加到特定对象上的静态或特定事件的事件处理程序的当前列表(在这种情况下传递的不是事件,而是MulticastDelegate
)
你不能作为参数传递的内容:事件本身......
您无法以直接的方式传递事件以允许附加另一个事件处理程序...因为您可能希望传递特定的obect实例,EventInfo
描述事件本身,和新的处理程序......
关于"简化":
你需要做的是:
- 使用反射来获取所需事件的EventInfo
个对象
- 为每个实例和每个EventInfo调用EventInfo.AddEventHandler,将实例作为目标传递,将eventhandler作为处理程序传递
因为您无法将事件作为参数传递,所以无法提取简单且类型安全的方法来获取所需的EventInfo对象。您将不得不按名称使用某些选择,或使用Type.getEvent或Type.getEvents
将实例类型分开的其他逻辑所以,如果你没有处理大量的事件,比如几百个,那么像你一样写它似乎是最好的方式......反射方法将更简单或更短
答案 1 :(得分:0)
有一种方法可以同时分配多个不需要反射的事件处理程序,但这并不重要,而且需要进行一些编程。如果要在循环中初始化事件,可以使用字典存储事件。
作为旁注:根据惯例,只有在委托类型为event
时才应使用EventHandler
关键字。当他们试图使用它时,它可能会并且可能会混淆其他人。
Hoge
上课:
public class Hoge
{
// A dictionary to store your events.
private Dictionary<string, EventHandler> events = new Dictionary<string, EventHandler>()
{
{ "EventA", null },
{ "EventB", null },
{ "EventC", null }
};
// Event add/remove accessors.
public event EventHandler EventA
{
add
{
lock (events)
{
events["EventA"] += (EventHandler)events["EventA"] + value;
}
}
remove
{
lock (events)
{
events["EventA"] += (EventHandler)events["EventA"] - value;
}
}
}
// You can do the same for other events.
public event EventHandler EventB;
public event EventHandler EventC;
public Hoge()
{
// Initialize events in a loop.
foreach (var key in events.Keys.ToList())
{
events[key] += FugaMethod;
}
}
// Raises EventA.
public void RaiseEventA()
{
EventHandler handler;
if (null != (handler = (EventHandler)events["EventA"]))
{
handler(this, EventArgs.Empty);
}
}
// Event handler.
private void FugaMethod(object sender, EventArgs e)
{
Console.WriteLine("Hello.");
}
}
用法:
class Program
{
static void Main(string[] args)
{
new Hoge().RaiseEventA();
}
}
How to: Use a Dictionary to Store Event Instances (C# Programming Guide)