如何调用所有事件处理程序订阅者并获得他们的结果?
How to call all event handler subscribers and get their result?
我有这个片段:
public static void Main()
{
OnComparaison += LePlusPetit;
OnComparaison += LePlusGrand;
Console.WriteLine(OnComparaison(0, 9));
Console.ReadKey();
}
public static int LePlusPetit(object obj1, object obj2)
{
int int1 = (int)obj1;
int int2 = (int)obj2;
return (int1 < int2) ? int1 : int2;
}
public static int LePlusGrand(object obj1, object obj2)
{
int int1 = (int)obj1;
int int2 = (int)obj2;
return (int1 > int2) ? int1 : int2;
}
public delegate int Comparer(object obj1, object obj2);
public static event Comparer OnComparaison;
结果一直如此9
。所以我需要知道:
- 是否只执行最后一个订阅的事件处理程序而不是所有订阅者?
- 如果是这样,我如何修改代码以使所有订阅的事件处理程序在事件触发时执行?
Does only the last subscribed event handler is executed not all the subscribers?
不是,都执行了但是结果是最后执行方法的return值
您可以调用 EventName.GetInvocationList()
让所有代表订阅该事件。
通过这种方式,您可以调用每个委托并 return 结果,以任何您想要的方式。
foreach (Comparer c in OnComparaison.GetInvocationList())
{
int result = c(0, 9);
}
这样,您可以获得所有结果,例如:
IEnumerable<int> allValues = OnComparaison
.GetInvocationList()
.Select(x => ((Comparer)x)(0, 9));
我有这个片段:
public static void Main()
{
OnComparaison += LePlusPetit;
OnComparaison += LePlusGrand;
Console.WriteLine(OnComparaison(0, 9));
Console.ReadKey();
}
public static int LePlusPetit(object obj1, object obj2)
{
int int1 = (int)obj1;
int int2 = (int)obj2;
return (int1 < int2) ? int1 : int2;
}
public static int LePlusGrand(object obj1, object obj2)
{
int int1 = (int)obj1;
int int2 = (int)obj2;
return (int1 > int2) ? int1 : int2;
}
public delegate int Comparer(object obj1, object obj2);
public static event Comparer OnComparaison;
结果一直如此9
。所以我需要知道:
- 是否只执行最后一个订阅的事件处理程序而不是所有订阅者?
- 如果是这样,我如何修改代码以使所有订阅的事件处理程序在事件触发时执行?
Does only the last subscribed event handler is executed not all the subscribers?
不是,都执行了但是结果是最后执行方法的return值
您可以调用 EventName.GetInvocationList()
让所有代表订阅该事件。
通过这种方式,您可以调用每个委托并 return 结果,以任何您想要的方式。
foreach (Comparer c in OnComparaison.GetInvocationList())
{
int result = c(0, 9);
}
这样,您可以获得所有结果,例如:
IEnumerable<int> allValues = OnComparaison
.GetInvocationList()
.Select(x => ((Comparer)x)(0, 9));