C# 经典实例 第一章 类和泛型 #1.15 控制如何触发多播委托中的一个委托

问题:

你组合了多个委托来创建一个多播委托。当调用这个多播委托时,将依次调用其中的每个委托。你需要施加更多的控制。例如,调用每个委托的顺序,只触发一个委托子集或者基于前一个委托成功与否来触发每个委托。此外,你需要能够单独处理每个委托的返回值。


解决方案:

使用GetInvocationList 方法获得Delegate 对象的数组。接下来,使用for 循环(如果以非标准顺序进行枚举)或foreach 循环(如果以标准顺序进行枚举)遍历这个数组。然后可以逐个调用数组中的每个Delegate 对象,并且可以获取每个委托的返回值。

在C# 中,所有委托类型都支持多播;也就是说,如果这样设置,那么任何委托实例在每次调用时都可以调用多个方法。在本范例中,我们使用术语多播(multicast)来描述设置为调用多个方法的委托。

下面的方法创建一个名为allInstances 的多播委托,然后使用GetInvocationList 以逆序逐一调用每个委托。Func<int> 泛型委托用于创建返回int 的委托实例。

public static void InvokeInReverse()
{
    Func<int> myDelegateInstance1 = TestInvokeIntReturn.Method1;
    Func<int> myDelegateInstance2 = TestInvokeIntReturn.Method2;
    Func<int> myDelegateInstance3 = TestInvokeIntReturn.Method3;
    Func<int> allInstances =
    myDelegateInstance1 +
    myDelegateInstance2 +
    myDelegateInstance3;
    Console.WriteLine("Fire delegates in reverse");
    Delegate[] delegateList = allInstances.GetInvocationList();
    foreach (Func<int> instance in delegateList.Reverse())
    {
        instance();
    }
}

注意,为了翻转使用GetInvocationList 得到的委托列表,我们使用了IEnumerable<T> 的扩展方法Reverse,以枚举通常产生数据项时的相反顺序获得它们。

如下面的方法所示, 通过触发每隔一个的委托, 你不必调用列表中的所有委托。

InvokeEveryOtherOperation 使用此处为IEnumerable<T> 创建的名为EveryOther 的扩展方法,该方法从枚举中每隔一个数据项进行返回。

(注:如果使用单播委托,并且对它调用GetInvocationList,将会获得一个包含单一委托实例的列表。)

public static void InvokeEveryOtherOperation()  
{  
Func<int> myDelegateInstance1 = TestInvokeIntReturn.Method1;  
Func<int> myDelegateInstance2 = TestInvokeIntReturn.Method2;  
Func<int> myDelegateInstance3 = TestInvokeIntReturn.Method3;  
Func<int> allInstances = myDelegateInstanc
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值