Invok方法调用时,将对委托链上的委托实例进行递归调用,即从head的入口开始上溯到下标为0的元素,最终实际的回调顺序和元素入链的先后顺序相同。
通常,在使用委托的时候,必须要知道对应的回调方法的原型,但System.Delegate提供有几个方法允许在编译时不知道这些原型方法的信息时仍然能使用委托。
//伪代码
//上溯
if (_prev != null) _prev.Invok();
//调用回调方法
_target.methodPtr();
当委托链递归调用时,除最后一个回调方法的返回值,其他的都被抛弃;另一点,当委托链上一点发生阻塞或异常,将影响其他的委托对象。
MulticastDelegate 提供有一个GetInvocationList方法,返回类型是Delegate[ ] 用于获取委托链的克隆(clone)体,获取到的克隆体的_prev被置为null,即原来链上的每个元素克隆过来都变成一个个孤立的个体。同样,GetInvocationList返回的Delegate[ ] 的顺序一致,即Delegate[ 0] 是最先入链的委托对象。
MouseFamily.Feedback feedback=null;
feedback+=new MouseFamily.Feedback(Tom.Cry);
feedback+=new MouseFamily.Feedback(Tim.Cry);
feedback += new MouseFamily.Feedback(master.say);
Delegate[] getDeles=feedback.GetInvocationList();
//getDeles[0].Method.Name=Tom.Cry
//getDeles[1].Method.Name=Tim.Cry
//getDeles[2].Method.Name=master.say
for (int i = 0; i < getDeles.Length; i++)
{
string methodName=getDeles[i].Method.Name;
//这里可以单独操作特定的委托对象
//...
}
通常,在使用委托的时候,必须要知道对应的回调方法的原型,但System.Delegate提供有几个方法允许在编译时不知道这些原型方法的信息时仍然能使用委托。
![](http://hi.csdn.net/attachment/201107/19/0_1311082587K2H2.gif)
System.Delegate中有若干静态的重载方法CreateDelegate,其返回类型是Delegate,用于创建在编码时不知回调方法具体情况的委托。
实例方法DynamicInvoke可以在运行的时候传递一组参数来调用回调方法,并且能确保传递的参数和回调方法兼容。
MulticastDelegate
MulticastDelegate
MulticastDelegate