事件或委托获取多个返回值和异常处理
理论知识:
1. 委托在编译后会生成一个继承自MulticastDelegate的类,而这个MulticastDelegate又继承自Delegate。在Delegate内部,维护了一个委托链表,链表上的每一个元素为一个只包含一个目标方法的委托对象。而通过Delegate基类的GetInvocationList()静态方法,可以获得这个委托链表。随后便利这个链表,通过链表中的每一个委托对象来调用方法,这样就可以分别获得每一个方法的返回值
2. Delegate基类中的DynamicInvoke()方法:
public object DynamicInvoke(params object[] args)
这是调用委托最通用的方法了,适用于所有类型的委托。它接受的参数为 params object[] ,也就是说它可以将任意类型作为参数,并返回单个object对象。
如下是一个通用的调用委托链表中方法的方法:
1 private static List<object> FireEvent(Delegate del, params object[] args) 2 { 3 List<object> objLst = new List<object>(); 4 if (del != null) 5 { 6 Delegate[] delegates = del.GetInvocationList(); 7 foreach (Delegate method in delegates) 8 { 9 try 10 { 11 object obj = method.DynamicInvoke(args); 12 if (obj != null) 13 { 14 objLst.Add(obj); 15 } 16 } 17 catch (Exception e) 18 { 19 20 } 21 22 } 23 } 24 25 return objLst; 26 }