如何将相同的方法分配给多个委托
How to assign the same method to multiple delegates
是否可以同时将同一个方法分配给多个委托?
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() 的赋值。
因为事件不能作为参数......不幸的是......没有
如果我们谈论的是一大堆事件,反思将是一种方式......但我不会真正称之为 "simplification"
编辑:
澄清:
您可以作为参数传递的内容:
附加到特定对象上的静态或特定事件的当前事件处理程序列表(在这种情况下,您传递的不是事件,而是 MulticastDelegate
)
不能作为参数传递的:事件本身...
您无法以允许附加另一个事件处理程序的直接方式传递事件...为此您可能希望传递特定的对象实例,EventInfo
描述事件本身,以及新的处理程序...
关于"simplification":
您需要做的是:
——使用反射获取想要的事件的EventInfo
对象
-对于每个实例和每个 EventInfo 调用 EventInfo.AddEventHandler,将实例作为目标传递,将事件处理程序作为处理程序传递
由于无法将事件作为参数传递,因此无法提取简单且类型安全的方法来获取所需的 EventInfo 对象。您将不得不按名称使用一些选择,或使用 Type.getEvent 或 Type.getEvents
将实例类型分开的其他逻辑
因此,如果您不处理一大堆事件,比如几百个,那么像您所做的那样编写它似乎是更可取的方式……反射方法绝不会更简单或更短
有一种方法可以一次分配多个事件处理程序,不需要反射,但这并不简单,需要一些编程。如果你想在循环中初始化事件,你可以使用字典来存储你的事件。
附带说明:按照惯例,只有在委托类型为 EventHandler
时才应使用 event
关键字。当其他人尝试使用它时,它可能并且很可能会使其他人感到困惑。
Hoge
class:
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)
是否可以同时将同一个方法分配给多个委托?
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() 的赋值。
因为事件不能作为参数......不幸的是......没有
如果我们谈论的是一大堆事件,反思将是一种方式......但我不会真正称之为 "simplification"
编辑:
澄清:
您可以作为参数传递的内容:
附加到特定对象上的静态或特定事件的当前事件处理程序列表(在这种情况下,您传递的不是事件,而是 MulticastDelegate
)
不能作为参数传递的:事件本身...
您无法以允许附加另一个事件处理程序的直接方式传递事件...为此您可能希望传递特定的对象实例,EventInfo
描述事件本身,以及新的处理程序...
关于"simplification":
您需要做的是:
——使用反射获取想要的事件的EventInfo
对象
-对于每个实例和每个 EventInfo 调用 EventInfo.AddEventHandler,将实例作为目标传递,将事件处理程序作为处理程序传递
由于无法将事件作为参数传递,因此无法提取简单且类型安全的方法来获取所需的 EventInfo 对象。您将不得不按名称使用一些选择,或使用 Type.getEvent 或 Type.getEvents
将实例类型分开的其他逻辑因此,如果您不处理一大堆事件,比如几百个,那么像您所做的那样编写它似乎是更可取的方式……反射方法绝不会更简单或更短
有一种方法可以一次分配多个事件处理程序,不需要反射,但这并不简单,需要一些编程。如果你想在循环中初始化事件,你可以使用字典来存储你的事件。
附带说明:按照惯例,只有在委托类型为 EventHandler
时才应使用 event
关键字。当其他人尝试使用它时,它可能并且很可能会使其他人感到困惑。
Hoge
class:
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)